如果要在Python中包裝現有的C或C ++功能,有很多選擇,這裏只記錄最值得推薦的方式,SWIG被Subversion, wxPython, Xapian等項目使用。值得一提的是,Google也使用SWIG。
用SWIG包裝Python代碼
SWIG本質上是一種宏語言,可以植入C代碼,並且可以爲你選擇的語言(python)生成包裝器代碼。
SWIG包裝“ hello”程序需要三件事。
第一步,生成文件
swig -python -c++ -o _swigdemo_module.cc swigdemo.i
python setup.py build_ext --inplace
- 首先,運行SWIG生成C代碼擴展;
- 然後,setup.py build 以實際構建它。
第二步,構建SWIG包裝文件“ swigdemo.i”
在這種情況下,它可能非常簡單:
%module swigdemo
%{
#include <stdlib.h>
#include "hello.h"
%}
%include "hello.h"
- %module指定要從該包裝文件生成的模塊的名稱;
- %{%}之間的代碼按原樣放置在C輸出文件中;在這種情況下,它僅包含兩個頭文件。
- 最後一行%include只是說“針對此頭文件中的聲明構建接口”。
第三步,構建setup.py文件
from distutils.core import setup, Extension
extension_mod = Extension("_swigdemo", ["_swigdemo_module.cc", "hello.c"])
setup(name = "swigdemo", ext_modules=[extension_mod])
現在,當我們運行“ make
”時,swig將生成_swigdemo_module.cc
文件以及“ swigdemo.py
”文件。然後,setup.py
將兩個C文件一起編譯到一個共享庫’_swigdemo
'中,該庫由swigdemo.py
導入;那麼用戶就可以“導入swigdemo
”並直接訪問包裝模塊中的所有內容。
SWIG可以直接接受 .h 頭文件做爲接口描述文件。在有了接口描述文件後,就可以利用 swig 命令生成包裝代碼了,然後將包裝代碼編譯鏈接成可被其他語言調用的庫。
參考:
https://intermediate-and-advanced-software-carpentry.readthedocs.io/en/latest/c+±wrapping.html
https://segmentfault.com/a/1190000013219667