使用模块编译的Python代码版本的兼容性

时间:2017-10-23 10:05:33

标签: python python-2.7 python-module pyc

假设我使用NumPy,SciPy,MatPlotLib等模块编译包含代码的一些python文件(.py.pyc / .pyo)。如果我在另一个配置(即客户端)上执行它们,是否需要模块版本相同?或者我只能处于兼容版本的范围内?

2 个答案:

答案 0 :(得分:4)

即使是编译后的字节码,模块中的名称仍然是字符串。只要模块的接口兼容,代码仍然可以使用不同的模块版本。

答案 1 :(得分:2)

.pyc.pyo文件只是缓存的字节码。 Python的导入机制完全围绕字符串构建,这使得执行导入的代码与它们导入的任何库分离。

因此,这些文件与源代码本身导入的库版本不再相关。如果源代码适用于各种版本的库,那么编译后的字节码也是如此。

您可以随时查看Python使用dis module生成的字节码。直接import语句变为:

>>> import dis
>>> dis.dis(compile('import numpy as np', '', 'single'))
  1           0 LOAD_CONST               0 (0)
              2 LOAD_CONST               1 (None)
              4 IMPORT_NAME              0 (numpy)
              6 STORE_NAME               1 (np)
              8 LOAD_CONST               1 (None)
             10 RETURN_VALUE

IMPORT_NAME opcode从附加到代码对象的co_names结构中获取名称(也存储在缓存中):

>>> compile('import numpy as np', '', 'single').co_names
('numpy', 'np')

这里numpy模块包含动态加载库的大部分内容并不重要;如果您将名称 numpy替换为将导入的其他内容。模块在运行时加载,而不是在编译时加载。