同时使用 Python C API 版本 2 和 3 的二进制文件

binary using both Python C API version 2 and 3

在一个开源项目1中,我们有 Python/Cython 和 C/C++ 模块与一个使用 Python C API 的 C++ 库混合在一起。 API 仅将几个函数的名称从 2 更改为 3。假设编写库时没有这些函数。如果用 Python2 编译,它会 link 到 Python3,反之亦然吗?这是否被 API headers 中的宏阻止?

拥有一个可以 link 两者的库二进制文件将使我们免于主要的打包麻烦。

不,这是行不通的。不要尝试。

二进制模块不能保证是二进制可移植的,即使是从 3.5 到 3.6。如果你幸运,那么有一些机制会阻止你做这种疯狂。但是,如果您以某种方式设法 link 库,将会有一些细微的差异会导致严重的错误,例如 PyObject 的布局发生变化等等。

Python 接口必须重新编译为准确的 Python 版本。 Python 2 和 3 之间的源兼容性是另一回事,并且相对容易实现。