Nhập khẩu có điều kiện các mô-đun trong Python


140

Trong chương trình của tôi, tôi muốn nhập Simplejson hoặc json dựa trên việc hệ điều hành mà người dùng đang bật là Windows hay Linux. Tôi lấy tên hệ điều hành làm đầu vào từ người dùng. Bây giờ, nó là chính xác để làm như sau?

osys = raw_input("Press w for windows,l for linux")
if (osys == "w"):
    import json as simplejson
else:
    import simplejson  

33
Tại sao bạn lấy tên os làm đầu vào từ người dùng? Nhìn vào mô-đun nền tảng. docs.python.org/l Library / pl platform.html platform.platform() hoặc platform.system()nên làm những gì bạn cần, thay vì người dùng phải nhập một cái gì đó mỗi khi mã được chạy.
Joe Kington

56
@ S.Lott: nghiêm túc? Bạn có biết rằng up / downvote có nghĩa là để phản ánh chất lượng của câu hỏi , phải không? Và không phải là bạn có đồng ý với điều gì khác trong mã của OP hay không.
jalf

2
@jalf: Đó là một câu hỏi tồi trong mọi cách trừ ngữ pháp. Nó không nên được tìm thấy như một phản ứng hàng đầu cho bất kỳ loại tìm kiếm nào.
S.Lott

11
@ S.Lott không có gì sai khi muốn biết nếu nhập khẩu có điều kiện là pythonic. Và rõ ràng những người khác đồng ý vì nó có hơn 50 phiếu bầu bất chấp những nỗ lực của bạn.
SARose

5
+1 cho khái niệm tôi đang tìm kiếm (chỉ nhập nếu sử dụng Win); và +1 khái niệm khác để bù đắp cho việc bỏ phiếu vô lý.
S3DEV

Câu trả lời:


182

Tôi đã thấy thành ngữ này được sử dụng rất nhiều, vì vậy bạn thậm chí không phải đánh hơi hệ điều hành:

try:
    import json
except ImportError:
    import simplejson as json

17
Trước tiên bạn nên thử nhập simplejson as jsonvì đây có thể là phiên bản mới hơn (nhanh hơn) của jsonmô-đun chuẩn .
Seppo Erviälä

hoặc ujsoncho tốc độ
lababidi 7/8/2015

59

Để trả lời câu hỏi trong tiêu đề của bạn nhưng không phải là trường hợp cụ thể mà bạn cung cấp, điều đó hoàn toàn chính xác, hàng tấn gói làm điều này. Có lẽ tốt hơn là tự mình tìm ra HĐH thay vì dựa vào người dùng; Đây là pySerial làm điều đó như một ví dụ.

serial/__init__.py

import sys

if sys.platform == 'cli':
    from serial.serialcli import Serial
else:
    import os
    # chose an implementation, depending on os
    if os.name == 'nt':  # sys.platform == 'win32':
        from serial.serialwin32 import Serial
    elif os.name == 'posix':
        from serial.serialposix import Serial, PosixPollSerial, VTIMESerial  # noqa
    elif os.name == 'java':
        from serial.serialjava import Serial
    else:
        raise ImportError(
            "Sorry: no implementation for your platform ('{}') available".format(
                os.name
            )
        )

Điều này chỉ nên được sử dụng trong trường hợp bạn đang giả định và cần một sự đảm bảo chắc chắn rằng các giao diện / tính năng nhất định sẽ có ở đó: ví dụ: một 'tệp' được gọi /dev/ttyX. Trong trường hợp của bạn: xử lý JSON, không có gì thực sự dành riêng cho hệ điều hành và bạn chỉ kiểm tra xem gói có tồn tại hay không. Trong trường hợp đó, chỉ cần trynhập nó và quay lại với exceptnếu nó không thành công:

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
Không, rất sai với tên hệ điều hành mã hóa cứng để quyết định có simplejsonhay không json. Bạn đang trích dẫn mã từ nhập khẩu dành riêng cho hệ điều hành , đây là một trường hợp rất khác. Xem câu trả lời của Matt cho cách tiếp cận chính xác.
Glenn Maynard

16
@Glenn Maynard: Tôi sẽ trì hoãn với bạn sau đó; Tôi chưa bao giờ sử dụng jsongói và đang cố gắng trả lời câu hỏi "bạn có thể nhập mô-đun có điều kiện" chung chung hơn không.
Nick T

7

Không nên sử dụng để liên kết json hoặc Simplejson với nền tảng HĐH. Simplejson là phiên bản mới hơn và nâng cao của json vì vậy chúng ta nên thử nhập nó trước.

Dựa trên phiên bản python, bạn có thể thử cách dưới đây để nhập json hoặc Simplejson

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.