Python 3.5 外部模块的向后兼容性
Backward compatibility of Python 3.5 for external modules
我已经构建了一个基于 Python 3.4.3 的 Python C++ 模块。后来我安装了 Python 3.5,并尝试加载我的 Python 模块。当我尝试这样做时,出现以下错误:
ImportError: Module use of python34.dll conflicts with this version of Python.
我尝试在命令提示符下通过 运行 Python 导入我的模块。
所以我想知道:在 Python 3.5 中是否没有向后兼容使用以前版本构建的模块?我必须用 Python 3.5 重新构建我的模块吗?
C(或 C++)扩展模块链接到编译它们所针对的解释器的 Python DLL,因此不仅要匹配版本号,还要匹配编译它所针对的体系结构(操作系统和 32 位与 64 位)。尝试使用另一个具有不同运行时 DLL 的解释器导入此类扩展模块会导致出现异常。
根据扩展,您可以尝试使用 C API 将其编译成 DLL,并使用 ctypes
模块连接 DLL。只要连接 DLL 的 Python 模块可移植到目标 Python 版本,共享库就是可移植的,仅受 32 位与 64 位选择的限制。
默认情况下,Python 仅尝试提供跨版本的源兼容性,而不是二进制兼容性;通常需要重新编译(由于明确链接了 Python 核心 DLL 的次要版本特定版本,因此在 Windows 上始终需要重新编译)。
虽然从 3.2 开始,扩展可以选择加入 API 的有限版本,保证在 Python 版本中保持 ABI 兼容,因此不需要重新编译,通过定义 Py_LIMITED_API
。您可以阅读 more details about using the stable ABI on the Python docs or on PEP 384,它首先定义了稳定 ABI 的概念。
我已经构建了一个基于 Python 3.4.3 的 Python C++ 模块。后来我安装了 Python 3.5,并尝试加载我的 Python 模块。当我尝试这样做时,出现以下错误:
ImportError: Module use of python34.dll conflicts with this version of Python.
我尝试在命令提示符下通过 运行 Python 导入我的模块。
所以我想知道:在 Python 3.5 中是否没有向后兼容使用以前版本构建的模块?我必须用 Python 3.5 重新构建我的模块吗?
C(或 C++)扩展模块链接到编译它们所针对的解释器的 Python DLL,因此不仅要匹配版本号,还要匹配编译它所针对的体系结构(操作系统和 32 位与 64 位)。尝试使用另一个具有不同运行时 DLL 的解释器导入此类扩展模块会导致出现异常。
根据扩展,您可以尝试使用 C API 将其编译成 DLL,并使用 ctypes
模块连接 DLL。只要连接 DLL 的 Python 模块可移植到目标 Python 版本,共享库就是可移植的,仅受 32 位与 64 位选择的限制。
默认情况下,Python 仅尝试提供跨版本的源兼容性,而不是二进制兼容性;通常需要重新编译(由于明确链接了 Python 核心 DLL 的次要版本特定版本,因此在 Windows 上始终需要重新编译)。
虽然从 3.2 开始,扩展可以选择加入 API 的有限版本,保证在 Python 版本中保持 ABI 兼容,因此不需要重新编译,通过定义 Py_LIMITED_API
。您可以阅读 more details about using the stable ABI on the Python docs or on PEP 384,它首先定义了稳定 ABI 的概念。