Python 中模块的条件导入

在我的程序中,我想导入 simplejsonjson基于操作系统是 Linux 或 Windows。我从用户那里获取操作系统名称作为输入。现在,在这种情况下做这件事是正确的吗?

osys = raw_input("Press l for linux, w for Windows:")
if (osys == "w"):
import json as simplejson
else:
import simplejson
116762 次浏览

为了回答你的 书名中的问题,而不是你提供的特殊情况下,这是完全正确的,吨包这样做。与其依赖于用户,还不如自己搞清楚操作系统; 以 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

我见过很多人使用这个习惯用法,所以你甚至不需要嗅探操作系统:

try:
import json
except ImportError:
import simplejson as json

不建议使用 OS 平台绑定 json 或 simplejson。Simplejson 是 json 的较新和高级版本,因此我们应该首先尝试导入它。

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

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