2012-01-31 49 views
8

我通過wrapping C libraryC++ library上的以下兩條線索閱讀,我不確定我是否得到它。我正在使用的C++庫確實使用了類和模板,但沒有采用任何過於複雜的方式。有什麼問題或ctypes包裝它的警告(除了你可以在純python等這樣做)? PyCXX,Cython和boost :: python是人們提到的另外三種選擇,對於C++來說有沒有什麼共識呢?用ctypes包裝C++庫是一個壞主意?

感謝

奧利弗

回答

9

對於C++庫可訪問在Python它必須用C出口的名字,這基本上意味着,一個名爲foo功能將可以訪問來自ctypes的爲foo

這可以通過封閉具有export C {}公共接口,這反過來又不允許在其中函數重載和模板(僅庫的公共接口來實現要包裝是相關的,內部工作未並且可以使用他們喜歡的任何C++功能)。

這樣做的原因是C++編譯器使用名爲的名稱修改爲重載或模板化符號生成唯一名稱。雖然​​仍然會找到一個函數,只要您知道它的名稱是錯誤的,那麼這個修改方案取決於正在使用的編譯器/鏈接器,並且沒有任何可以依賴的方法。 簡而言之:不要使用ctypes來封裝在其公共接口中使用C++功能的庫。

Cython採取不同的方法。它幫助您構建一個C擴展模塊,與原始庫進行交互。因此,通過常規的C++連接機制連接到C++庫,從而避免了上述問題。 Cython的麻煩在於C擴展庫需要爲每個平臺重新編譯,但無論如何,這也適用於C++庫的封裝。我個人認爲,在大多數情況下,啓動Cython的時間是一段耗費時間,並且最終會比ctypes付出代價(除了真正簡單的Cish接口外)。

我對boost.python沒有任何經驗,所以我不能評論它(但是,我沒有感覺它很受歡迎)。

+0

感謝您提供Cython作爲選項!我選擇它來包裝C api並獲得了積極的體驗 - 就像編寫Python中包含幾行C一樣,並且提供了很多控制權。有一件事情我很難得到構建過程的權利 - 我最終在創建源代碼發佈之前預先編譯了Cython文件。如果有人有類似的問題,我詳細解釋了我如何用Cython包裝我的C api,包括構建過程:http://martinsosic.com/development/2016/02/08/wrapping-c-library-as-python -module.html – Martinsos 2017-02-21 09:49:03

14

boost::python防禦,因爲亞歷山大對ctypes的答案:

加速Python提供C的非常「C++」界面++和Python代碼 - 甚至做這樣的事情類重寫虛擬方法的C++允許蟒子是相對簡單的。這裏有一個很好的功能的盆栽列表:

  • 允許虛擬方法的C++類被python子類覆蓋。std::vector<>std::map<>與Python引用計數實例和python列表和字典(使用vector_indexing_suitemap_indexing_suite)在智能指針的引用計數
  • 自動共享(boost::shared_ptr等)之間
  • 橋(你可以將此擴展到任何智能指針)。
  • 傳遞參數並從函數返回值時對所有權進行細粒度控制。

基本上,如果你有一個設計想要以忠於語言的方式公開一個C++接口,那麼boost :: python可能是最好的方法。

唯一的缺點是增加了編譯時間(boost :: python廣泛使用了模板),並且有時會出現不透明的錯誤消息,如果你沒有把事情做得很正確。

+2

另一個問題是boost和python版本的強耦合。例如,如果你升級你的python版本,你將不得不重建boost版本 – user1827356 2013-05-16 17:03:22

相關問題