2008-11-10 50 views
37

我目前正在研究一個項目,我不得不用Python包裝C++類以便能夠編寫腳本程序。所以我的具體經驗也涉及到在我們的程序中嵌入Python解釋器。向Python公開一個C++ API

我試過的替代品:

  • Boost.Python的

    我喜歡用Boost.Python的產生的更簡潔的API,但事實上,它會要求用戶安裝做一個額外的依賴我們切換到SWIG。

  • 痛飲

    呷主要用於我們的優勢是,它不要求最終用戶安裝使用的最終方案。

你以前做過什麼,以及你曾經使用過什麼?

回答

22

我用兩個(同一項目):加速是較好的綜合與STL,特別是C++異常。另外,它的內存管理機制(試圖連接C++內存管理和Python GC)比SWIG更靈活。但是,SWIG具有更好的文檔,沒有外部的依賴關係,如果你包裹在夜風庫爲Python你比那裏得到一個Java/Perl的/ Ruby包裝器,以及中途更多。

我不認爲有明確的選擇:對於較小的項目,我會再次使用Boost.Python,對於大型長壽命項目,SWIG的額外投資是值得的。

5

pyrexcython也是兩個世界的混合良好和簡便的方法。

包裝C++使用這些工具是麻煩一下,然後包裝C,但它可以做到的。 Here是關於它的維基頁面。

6

我建議SIP。由於以下原因,SIP比SWIG更好:

  1. 對於給定的一組文件,swig會生成比SIP更多的重複(開銷)代碼。 SIP通過使用可靜態或動態鏈接的庫文件來管理生成較少的重複(開銷)代碼。換句話說,SIP具有更好的可擴展性。 SIP的

  2. 執行時間比痛飲的要少得多。請參閱Python Wrapper Tools: A Performance Study。不幸的是,鏈接似乎中斷我有一個可以根據要求共享的個人副本。

+0

我有興趣看到它,你可以發佈它的地方,並鏈接到它?否則,我們可以安排你直接發送給我 – 2008-11-13 16:56:03

+4

wayback機器有一個副本:http: //web.archive.org/web/20070703071726/http://people.web.psi.ch/geus/talks/europython2004_geus.pdf – 2008-11-14 00:00:18

18

編輯 - 羅賓項目可悲的是被遺棄的,並且將沒有多大用處今天

我用Robin取得了巨大成功。

很好與C++類型的集成,並創建一個.cpp文件來編譯和包含在你的共享對象中。

2

Boost :: Python的一大優點是,它允許在ipython shell中完成tab:您可以直接導入由Boost公開的C++類,或者將其子類化,並且從此它的行爲就像純Python類。

的缺點:它需要很長時間來安裝和使用,所有的製表完成省時永遠不會攤銷;-(

升壓所以我更喜歡痛飲:不花俏,但工作可靠經過一個簡短的介紹性例子,