有条件地在Python中导入模块


140

在我的程序中,我想基于用户所在的操作系统是Windows还是Linux来导入simplejson或json。我将操作系统名称作为用户的输入。现在,执行以下操作是否正确?

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

33
您为什么要使用os名称作为用户输入?查看平台模块。docs.python.org/library/platform.html platform.platform()platform.system()应该执行您需要的操作,而不是让用户每次运行代码时都必须输入一些内容。
Joe Kington

56
@ S.Lott:认真吗?你知道,向上/ downvotes是为了反映的质量问题,对不对?而不是你是否同意一些其他的OP代码。
jalf

2
@jalf:除了语法,这在所有方面都是一个不好的问题。不应将其作为对任何搜索的最佳回应。
S.Lott

11
@ S.Lott想要知道条件导入是否为pythonic并没有错。显然,其他人也同意,尽管您付出了很大的努力,但它还是获得了+50的赞成票。
SARose

5
我正在寻找的概念+1(仅在使用Win时才导入);另一个概念上的+1,以补偿可笑的降票。
S3DEV '18

Answers:


182

我已经见过这个习惯用法很多,因此您甚至不必进行OS嗅探:

try:
    import json
except ImportError:
    import simplejson as json

17
您应该首先尝试导入,simplejson as json因为它可能是标准json模块的更新(更快)版本。
SeppoErviälä2012年

还是ujson为了提高速度
lababidi 2015年

59

要回答标题中的问题,而不是回答您提供的特殊情况,这是完全正确的,大量的软件包可以这样做。最好自己弄清楚操作系统,而不要依赖用户。这里以pySerial为例。

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
            )
        )

仅在您假设并需要强烈保证某些接口/功能在那里的情况下才应使用此方法:例如,名为的“文件” /dev/ttyX。在您的情况下:处理JSON,实际上没有任何特定于OS的内容,而您只是在检查软件包是否存在。在这种情况下,只需try导入即可,except如果失败则返回一个:

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
不,这是非常不正确的硬编码OS的名称,以决定是否simplejsonjson可用。您引用的是固有于操作系统的导入中的代码,这是完全不同的情况。请参阅Matt的答案以获取正确的方法。
格伦·梅纳德

16
@格伦·梅纳德:那我就顺便告诉你;我从未使用过该json软件包,而是试图回答更笼统的“您可以有条件地导入模块”问题。
尼克T

7

建议不要将json或simplejson与OS平台绑定。simplejson是json的更新和高级版本,因此我们应尝试首先将其导入。

基于python版本,您可以尝试以下方式导入json或simplejson

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.