這段時間一直在摸索swing,用它來封裝C++代碼來生成python腳步語言。並總結了swing從安裝到配置再到代碼封裝編譯生成動態庫的整個過程,下面這篇文章都是我在實際的運用中的一些經驗總結,分享給你們。python
Python調用C/C++代碼的利器除了boost_python外,還有SWIG(Simplified Wrapper and Interface Generator),它是用來爲腳本語言調用C和C++程序的軟件開發工具,它其實是一個編譯器,獲取C/C++的聲明和定義,用一個殼封裝起來,以便其它腳本語言訪問這些聲明。因此,SWIG 最大的好處就是將腳本語言的開發效率和 C/C++ 的運行效率有機的結合起來。linux
前面的文章提到一個C++實現的雙數組Trie Tree的實現:cedar,它在中文分詞、新詞發現等算法中的應用。本文以cedar的SWIG封裝實現來講明SWIG的使用。c++
工欲善其事必先利其器,首先要安裝swig,Ubuntu安裝swig很簡單:算法
sudo aptitude install swig
在cedar的swig目錄下面有cedar的C++聲明和實現代碼trie.h,可是這個實現裏面沒有遍歷全部key的函數方法,因此我添加了一個實現,首先定義一個數據結構來定義key:數組
// key-value pair return type for next_key() class kv_t { public: std::string key; int value; };
添加一個函數每次返回一個key,當key字符串爲空時表示遍歷結束,繼續調用的話就又從頭開始遍歷:數據結構
// to iterate all keys kv_t next_key() const { static size_t from = 0, p = 0; union { int i; int x; } b; char key[256] = {0}; kv_t kv; if(from == 0) { b.i = _t->begin(from, p); }else{ b.i = _t->next(from, p); } if (b.i == trie_t::CEDAR_NO_PATH) { kv.key = ""; kv.value = 0; from = 0; p = 0; return kv; } _t->suffix(key, p, from); kv.key = key; kv.value = b.x; return kv; }
查看cedar.i能夠看到SWIG的接口文件的編寫規則:app
能夠在Makefile裏面看到python-bindings:函數
python-bindings: swig -Wall -python -builtin -outdir python -c++ cedar.i mv -f cedar_wrap.cxx python
直接make或者單獨運行上面的swig命令,就能夠生成cedar.py和cedar_wrap.cxx文件。工具
編譯生成的cedar_wrap.cxx使用python distutils的setup,能夠參考python/setup.py的編寫。setup.py的build以下:學習
python setup.py build
就會在當前目錄下面建立目錄build,下面生成lib.linux-x86_64-2.7/cedar.py 和 _cedar.so
個人python學習筆記:www.yuanrenxue.com