2017-06-02 132 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