在一個開源項目1中,我們使用Python C API將Python/Cython和C/C++模塊與一個C++庫混合在一起。該API只將一些函數的名稱從2改爲3.假設該庫沒有這些函數編寫。如果使用Python2進行編譯,它會鏈接到Python3,反之亦然?這是由API頭中的宏阻止的嗎?使用Python C API版本2和3的二進制文件
擁有可鏈接到二者的庫二進制文件將使我們免除主要的包裝麻煩。
在一個開源項目1中,我們使用Python C API將Python/Cython和C/C++模塊與一個C++庫混合在一起。該API只將一些函數的名稱從2改爲3.假設該庫沒有這些函數編寫。如果使用Python2進行編譯,它會鏈接到Python3,反之亦然?這是由API頭中的宏阻止的嗎?使用Python C API版本2和3的二進制文件
擁有可鏈接到二者的庫二進制文件將使我們免除主要的包裝麻煩。
不,它不會工作。不要嘗試。
不保證二進制模塊是二進制便攜式的,即使從3.5到3.6也是如此。如果你是幸運,那麼有一些機制,將禁止你做這個瘋狂。但是,如果您設法以某種方式鏈接庫,則會有一些細微的差異,會導致嚴重的錯誤,例如PyObject
佈局等等。
Python接口必須重新編譯爲確切的Python版本。 Python 2和Python 3之間的源代碼兼容性是不同的,並且相對容易實現。
一些漂亮的基本功能的名稱已經改變(例如模塊初始化我認爲)主要是爲了防止你這樣做。 – DavidW
API比較穩定,A * B * I不是。所以你需要重新編譯每個Python版本。編輯:請參閱下面的Antti Haapala的回答@DavidW評論中的鏈接,以獲取更多解釋。 – Toby