5. SWIG wrap c++ into python¶
SWIG 是一个简单快捷地封装C/C++成更高级的语言的软件。它可以将 C/C++ 封装成包括Perl, PHP, Python, Tcl and Ruby在内的各种高级语言。
这里我整理一个linux下如何将C++封装成python的简单例子。
例子里有如下几个文件:
example.i
example.cxx
example.h
Makefile
example.i里面定义了封装后的python包里的函数和类。 example.h 和example.cxx是一个完整的C++程序包, 这里面的函数以及类不一定要在example.i里面出现。 也就是说example.i里面只要写上我们在python里面要用的函数和类就够了。
如果你想要封装的是一个复杂的C++ API,而使用的过程中又不需要整个API的所有功能,那么就可以自己写一个c++类调用你要用 的API,然后把自己的这个类封装成python包。这就体现了python的一个特性——“胶水语言”。
据说用SWIG封装可能会降低代码的执行效率,如果考虑效率的话那就只好用标准的更底层的封装方法了。那样的话需要大量的重写你的代码。
example.i
%module example
%{
#include "example.h"
%}
class caller{
public:
caller();
~caller();
int run();
};
example.cxx
#include "example.h"
caller::caller(){
}
caller::~caller(){
}
int caller::run(){
cout<<"running"<<endl;
return 0;
}
example.h
#include <iostream>
#include <iomanip>
#include <vector>
#include <list>
using namespace std;
class caller{
public:
int i;
caller();
~caller();
int run();
};
Makefile
all: example
clean:
rm -f example.py example.o example_wrap.cxx example_wrap.o _example.so example.pyc\
example:example.cxx
swig -c++ -python example.i
g++ -O2 -c -fPIC example.cxx -I../include
g++ -O2 -c -fPIC -I/usr/include/python2.7 example_wrap.cxx
g++ -shared example.o example_wrap.o -o _example.so