【问题标题】:Conditional import of modules in PythonPython中模块的条件导入
【发布时间】:2011-03-30 14:57:07
【问题描述】:

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

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

【问题讨论】:

  • 你为什么将操作系统名称作为用户的输入?查看平台模块。 docs.python.org/library/platform.html platform.platform()platform.system() 应该做你需要的,而不是让用户每次运行代码时都必须输入一些东西。
  • @S.Lott:认真的吗?你知道赞成/反对票是为了反映问题的质量,对吧?而不是您是否同意 OP 代码中的 else 内容。
  • @jalf:除了语法之外,这在各个方面都是一个糟糕的问题。不应将其作为对任何类型搜索的首选响应。
  • @S.Lott 想知道条件导入是否是 Pythonic 并没有错。显然其他人也同意,因为尽管您做出了努力,但它仍然获得了 +50 票。

标签: python


【解决方案1】:

要回答您 title 中的问题,而不是您提供的特定情况,这是完全正确的,大量的软件包都是这样做的。最好自己弄清楚操作系统,而不是依赖用户;这里以 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,实际上没有任何特定于操作系统的内容,您只是检查包是否存在。在这种情况下,只需 try 导入它,如果失败则使用 except 回退:

try:
    import some_specific_json_module as json
except ImportError:
    import json

【讨论】:

  • 不,硬编码操作系统名称来决定simplejsonjson 是否可用是非常不正确的。您引用的代码来自 inherently OS-specific 导入,这是一个非常不同的情况。有关正确方法,请参阅马特的答案。
  • @Glenn Maynard:那我就听你的了;我从未使用过 json 包,并试图回答更笼统的“你能有条件地导入模块”的问题。
【解决方案2】:

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

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

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json

【讨论】:

    【解决方案3】:

    我已经看到这个成语被大量使用了,所以你甚至不必进行操作系统嗅探:

    try:
        import json
    except ImportError:
        import simplejson as json
    

    【讨论】:

    • 您应该首先尝试导入simplejson as json,因为它可能是标准json 模块的更新(更快)版本。
    • ujson 速度
    猜你喜欢
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2021-11-06
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多