2017-06-02 131 views
1

在一个开源项目1中,我们使用Python C API将Python/Cython和C/C++模块与一个C++库混合在一起。该API只将一些函数的名称从2改为3.假设该库没有这些函数编写。如果使用Python2进行编译,它会链接到Python3,反之亦然?这是由API头中的宏阻止的吗?使用Python C API版本2和3的二进制文件

拥有可链接到二者的库二进制文件将使我们免除主要的包装麻烦。

+0

一些漂亮的基本功能的名称已经改变(例如模块初始化我认为)主要是为了防止你这样做。 – DavidW

+0

API比较稳定,A * B * I不是。所以你需要重新编译每个Python版本。编辑:请参阅下面的Antti Haapala的回答@DavidW评论中的链接,以获取更多解释。 – Toby

回答

1

不,它不会工作。不要尝试。

不保证二进制模块是二进制便携式的,即使从3.5到3.6也是如此。如果你是幸运,那么有一些机制,将禁止你做这个疯狂。但是,如果您设法以某种方式链接库,则会有一些细微的差异,会导致严重的错误,例如PyObject布局等等。

Python接口必须重新编译为确切的Python版本。 Python 2和Python 3之间的源代码兼容性是不同的,并且相对容易实现。

+2

对于Python> = 3.2,可以使用[稳定的API](https://docs.python.org/3/c-api/stable.html),但可以使用更多的API )。显然,这对OPs问题没有帮助,但它可以让你在一个二进制模块中执行3.5和3.6。 – DavidW

+0

感谢您的确切答案和@DavidW的链接。 – rwst