【问题标题】:Backward compatibility of Python 3.5 for external modulesPython 3.5 对外部模块的向后兼容性
【发布时间】:2016-02-13 16:20:08
【问题描述】:

我已经构建了一个基于 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 重新构建我的模块吗?

【问题讨论】:

  • 在安装 3.5 之前是否卸载了 python 3.4.3?
  • 否 - 但现在我尝试这样做 - 我卸载了所有 python 版本,并重新安装了 python 3.5。它没有帮助,同样的问题。
  • 是的,我认为您必须重新构建它 - Python 模块的向后兼容性得到保证,但对于任何外部 AFAIK 都没有。

标签: python python-3.x python-module cpython


【解决方案1】:

默认情况下,Python 只尝试提供跨版本的源代码兼容性,而不是二进制兼容性;通常需要重新编译(在 Windows 上总是需要重新编译,因为显式链接了 Python 核心 DLL 的次要版本特定版本)。

不过,从 3.2 开始,扩展可以选择使用 API 的有限版本,该版本保证在 Python 版本中保持 ABI 兼容,因此不需要重新编译,通过定义 Py_LIMITED_API。您可以阅读more details about using the stable ABI on the Python docsPEP 384,它首先定义了稳定 ABI 的概念。

【讨论】:

    【解决方案2】:

    C(或 C++)扩展模块与编译它们的解释器的 Python DLL 相关联,因此不仅要匹配版本号,还要匹配编译它的体系结构(操作系统和 32 与 32 版本)。 64 位)。尝试使用另一个具有不同运行时 DLL 的解释器导入此类扩展模块会导致您遇到异常。

    根据扩展,您可能会尝试使用 C API 将其编译为 DLL,并使用 ctypes 模块来连接 DLL。只要连接 DLL 的 Python 模块在目标 Python 版本之间是可移植的,共享库就是可移植的,仅受 32 位和 64 位选择的限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 2015-07-23
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多