使用模块的已编译 Python 代码的版本兼容性
Compatibility of versions for compiled Python code using modules
假设我编译了一些 python 文件(.py
到 .pyc
/ .pyo
),其中包含使用 NumPy、SciPy、MatPlotLib 等模块的代码。如果我在另一个配置(即客户端)上执行它们,是否要求模块版本相同?还是我只能在兼容版本的范围内?
即使是编译后的字节码,模块中的名称仍然是字符串。只要模块的接口兼容,代码仍然适用于不同的模块版本。
.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
模块包含大部分动态加载的库,这无关紧要;如果您将 name numpy
替换为其他可以导入的内容。模块是在运行时加载的,毕竟不是在编译时加载。
假设我编译了一些 python 文件(.py
到 .pyc
/ .pyo
),其中包含使用 NumPy、SciPy、MatPlotLib 等模块的代码。如果我在另一个配置(即客户端)上执行它们,是否要求模块版本相同?还是我只能在兼容版本的范围内?
即使是编译后的字节码,模块中的名称仍然是字符串。只要模块的接口兼容,代码仍然适用于不同的模块版本。
.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
模块包含大部分动态加载的库,这无关紧要;如果您将 name numpy
替换为其他可以导入的内容。模块是在运行时加载的,毕竟不是在编译时加载。