《python/c++接口庫比較(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )》http://blog.csdn.net/lainegates/article/details/19565823
目前有很多開源的Python/c++ 綁定工具,搜了好多岾子,這里稍微總結下。
SWIG
- 支持 Python 2 and 3
- 配置正確的話,可以全自動完成封裝(*.i文件需要自己寫)
- 當不是全自動的時候,它大多會重復你的.h文件並給出提示
- 除了Python外,還支持其他語言(Java, Ruby, Lua, 等)
- 輸出一個本地文件(這個文件會被編譯成.pyd)和一個封裝(這個封裝是python腳本,調用對應生成的.pyd)
- 綁定(Bindings)的性能不是太好,不支持內部類(inner classes)的封裝
- 不支持屬性(通過getter/setters訪問values)
- 文檔很全,很容易學習
- google使用了
- C++支持不太好
Boost::Python
- 支持 Python 2, 3和C++的綁定
- 對於新手來說,學習它的語法有一定難度。但是這些語法很直觀
- 大量使用了 C++ templates (可能是好事,也可能是壞事),會很明顯地提高編譯時間
- 隨boost庫一起發布,且boost庫有用,但很大
- 剛開始編譯使用boost.python封裝好的C++代碼時,出現的各種錯誤
- 一些語法不易學習,像函數返回值時的規則
- 非常可靠、穩定、經過充分測試的庫(boost庫里的部件都具有這特性)
- 不支持屬性
- 支持文檔寫得比較差,有些功能文檔里甚至都沒有寫。
- 編譯后的pyd文件有些大,這不利於在手機或者嵌入平台使用
- 配合py++使用,幾乎可以全自動封裝項目
Py++
- 支持 Python 2, 3 和C++的綁定
- 它調用boost.python自動完成項目綁定,相當於boost.python的高級工具
PyCxx
- 支持 Python 2, 3 和C++的綁定
- 輕量級的封裝庫,用的人挺多
- 只支持C++
- 目前沒有自動綁定工具
Python C api(Python 的幫助文檔里有)
- 性能高
- 靈活
- 適合嵌入式
- C++支持差
- 復雜
ctypes(Python自帶的庫)
- 靈活
- 對c的代碼幾乎無縫調用
- 使用起來比較繁瑣
- 只支持c語言
SIP
- 支持 Python 2, 3 和C++的綁定
- 在PyQt中使用過,其他地方很少見它
Weave
- 性能高
- 很少見
Pyrex
- 很少見
- 目前還沒有成熟的項目
- 性能較高
- 接近於Python語法
參考:http://stackoverflow.com/questions/1492755/python-c-binding-library-comparison
http://web.archive.org/web/20090604182721/http://www.suttoncourtenay.org.uk/duncan/accu/integratingpython.html
https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages
《Python擴展方法及工具比較》http://www.cdadata.com/4224
使用工具進行擴展:
雖然擴展過程並不復雜,但也可以使用許多已知的工具簡化擴展過程。
(1) SWIG
由David Beazley創建,是一個自動的擴展構造工具。它讀入注釋的C/C++頭文件,為python、tcl、perl等多種腳本語言產生wrap代碼。SWIG可以包裝大量C++特性到Python的擴展模塊中。詳情可參考http://www.swig.org。
評價:swig簡單,可以支持多種腳本文件,但支持的c++特性不完備。
(2) SIP
由Phil Thompson創建,是一個C++模塊構造器,專門為C++的類創造wrapper。它曾經被用於創建PyQt和PyKDE擴展模塊,因此比較出名。詳情可參考http://www.riverbankcomputing.co.uk/sip/。
評價:支持C++特征很齊全,但比較復雜。
(3) bgen
該工具被包含在標准Python發布包中的模塊構建工具集里,由Jack Jansen維護。它用於產生在Macintosh版本可用的Python擴展模塊。
(4) pyfort
由Paul dubois創建,用來產生Fortran語言生成的擴展模塊。詳見http://pyfortran.sourceforge.net。
(5) cxx
也由Paul Dubois創建,是一個庫,為Python的C++擴展提供了友好的API。Cxx允許將許多python對象(如list和tuple)使用到STL的運算中。庫也提供了C++異常處理到python異常處理的轉化。詳見http://cxx.sourceforge.net。
(6) WrapPy
由Greg Couch創建,通過讀入C++頭文件來產生擴展模塊。詳見http://www.cgl.ucsf.edu/home/gregc/wrappy/index.html。
(7) Boost Python Library
由David Abrahams創建。該庫提供了更多與眾不同的C++ wrap到python擴展中,而只需要對要擴展的C++類寫很少的附加信息。詳見http://www.boost.org/libs/python/doc。
評價:Boost為C++提供了許多實用的庫,如Regex(正則表達式庫)、Graph(圖組件和算法)、concept check(檢查泛型編程中的concept)、Thread(可移植的C++多線程庫)、Python(把C++類和函數映射到Python之中)、Pool(內存池管理)等等。
Boost總體來說是實用價值很高,質量很高的庫。並且強調對跨平台的支持。但是Boost中也有很多是實驗性質的東西,在實際的開發中實用需要謹慎。
boost.python支持的c++特性較多,但是比較復雜。