C
和 C++
被公認為(理當如此)創建高性能代碼的首選平台。對開發人員的一個常見要求是向腳本語言接口公開 C/C++
代碼,這正是 Simplified Wrapper and Interface Generator (SWIG) 的用武之地。SWIG 允許您向廣泛的腳本語言公開 C/C++
代碼,包括 Ruby、Perl、Tcl 和 Python等。
為了建立python的擴展模塊,SWIG采用分層的策略:用c寫擴充模塊,其余部分用python寫。c包含低層次的封裝,而python包含高層次的封裝。分層策略是擴展模塊的特定部分用特定的語言完成(而不全部用c/c++完成),另外通過利用2種語言,可以發揮各自語言的特性,增加靈活性。
1. 安裝(Windows)
下載:http://www.swig.org/download.html
解壓把swig.exe的地址寫入到環境變量的環境變量的Path變量中。
2. 例子(c語言)
#2.1 用c語言編寫頭文件和源文件為
/* File: example.h */ int fact(int n);
/* File: example.c */ #include "example.h" int fact(int n) { if (n < 0){ /* This should probably return an error, but this is simpler */ return 0; } if (n == 0) { return 1; } else { /* testing for overflow would be a good idea here */ return n * fact(n-1); } }
#2.2 寫swig模塊寫一個文件
/* File: example.i */ %module example %{ #define SWIG_FILE_WITH_INIT #include "example.h" %} int fact(int n);
#2.3 為了建python模塊,利用-python參數執行swig
swig -python example.i
執行完命令后生成兩個不同的文件:example_wrap.c和example.py。
自動生成文件名的原則:生成的c文件名與寫的c文件名有關(例如寫的c文件名為example.c則生成example_wrap.c);生成的python文件即.i文件中%module后面的名字。
#2.4 利用distutils生成動態庫
python自帶一個distutils工具,可以用它來創建python的擴展模塊。使用它也很簡單,只需要先定義一個配置文件,通常是命名為setup.py
""" setup.py """ from distutils.core import setup, Extension example_module = Extension('_example', sources=['example_wrap.c', 'example.c'], ) setup (name = 'example', version = '0.1', author = "SWIG Docs", description = """Simple swig example from docs""", ext_modules = [example_module], py_modules = ["example"], )
注:頭文件和源文件都是example.*,那么setup.py腳本中Extension的參數必須為“_example”
#2.5 編譯
python setup.py build
會在本目錄下build/lib*/下生成_example.pyd模塊,可以直接使用,例如
>>>import example >>>print example.fact(4) 24 >>>
可以吧動態模塊直接生成當前目錄下
python setup.py build_ext --inplace
3. 例子(c++)
和c一樣,稍微區別
#3.1 用c語言編寫頭文件和源文件為
/* File: example.h */ int fact(int n);
/* File: example.cpp */
#include "example.h"
int fact(int n) { if (n < 0){ /* This should probably return an error, but this is simpler */ return 0; } if (n == 0) { return 1; } else { /* testing for overflow would be a good idea here */ return n * fact(n-1); } }
#3.2 寫swig模塊寫一個文件
/* File: example.i */
%module example %{ #define SWIG_FILE_WITH_INIT #include "example.h" %} int fact(int n);
#3.3 為了建python模塊,利用-python參數執行swig
swig -c++ -python example.i
執行完命令后生成兩個不同的文件:example_wrap.cxx和example.py。
#3.4 利用distutils生成動態庫
python自帶一個distutils工具,可以用它來創建python的擴展模塊。使用它也很簡單,只需要先定義一個配置文件,通常是命名為setup.py
""" setup.py """ from distutils.core import setup, Extension example_module = Extension('_example', sources=['example_wrap.cxx', 'example.cpp'], ) setup (name = 'example', version = '0.1', author = "SWIG Docs", description = """Simple swig example from docs""", ext_modules = [example_module], py_modules = ["example"], )
注:頭文件和源文件都是example.*,那么setup.py腳本中Extension的參數必須為“_example”
#3.5 編譯
python setup.py build_ext --inplace