在Python中有条件地导入模块

Tim*_*Tim 124 python

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

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

Mat*_*son 170

我已经看到这个成语用了很多,所以你甚至不需要做OS嗅探:

try:
    import json
except ImportError:
    import simplejson as json
Run Code Online (Sandbox Code Playgroud)

  • 你应该首先尝试将`simplejson导入为json`,因为它可能是标准`json`模块的更新(更快)版本. (17认同)

Nic*_*k T 50

完全正确,大量的包裹做到这一点.最好自己弄清楚操作系统,而不是依赖于用户; 这里以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
            )
        )
Run Code Online (Sandbox Code Playgroud)

  • @Glenn Maynard:我会跟你说的; 我从来没有使用过`json`包并试图回答更一般的"你可以做条件导入模块"的问题. (15认同)
  • 不,硬编码OS名称来判断`simplejson`或`json`是否可用是非常不正确的.您引用*固有的特定于操作系统的*导入的代码,这是一个非常不同的情况.请参阅Matt对正确方法的回答. (11认同)

小智 7

不建议将json或simplejson与OS平台绑定.simplejson是json的新版本和高级版本,所以我们应该先尝试导入它.

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

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
Run Code Online (Sandbox Code Playgroud)