在Python中调用C++,使用SWIG

SWIG:Simplified Wrapper and Interface Generator,顾名思义,就是将C/C++包装为其他高级语言的Wrapper工具,非常好用。

该项目历史悠久(创始于1995年!),且一直非常活跃,目前最新版本为2011年5月发布的2.0.4。

1、安装SWIG

wget http://prdownloads.sourceforge.net/swig/swig-2.0.4.tar.gz
tar -xzvf swig-2.0.4.tar.gz
cd swig-2.0.4/
#我们这里只编译Python的语言支持,可以根据你得需要加别的!
./configure --without-alllang --with-python|grep python
make
sudo make install

2、C++代码
我们以包装一个简单的类为例子:

#include <string>
using std::string;

class MyObj
{
public:

    string SayHello(string name)
    {
        string ret("Hello, ");
        return ret + name;
    }
private:
    string id;
};

3、编写Interface文件
SWIG需要一个intf文件,可以写的很复杂,也可以偷懒:只引用你要Wrap的.h头问件就可以啦!

/* myobj.i */
%module myobj
%{
/* 相关引用 */
#include "MyObj.h"
#include <string>
%}

/* 对STL的支持 */
%include stl.i

/* Wrapper并生成代码 */
%include "MyObj.h"

4、生成Wrapper代码

#生成,第一个python是目标语言,跌入个-c++是启用c++模式
swig -python -c++ ./myobj.i

#成功的话,会生成如下文件
myobj.i  myobj_wrap.c  myobj_wrap.cxx
#编译,生成so文件,注意一定要用g++而不是ld做Link!!
g++ -c myobj_wrap.c myobj_wrap.cxx -I /usr/include/python2.6/
g++ -shared myobj_wrap.o -o myobj.so

5、测试

>>> import myobj
>>> o = myobj.MyObj()
>>> o.SayHello("ICT")
'Hello, ICT'
>>>

6、补充

如果你想使用复合类型,例如vector<string>,请务必在.i文件中声明!

namespace std{
%template(VectorOfString) vector<string>;
}

3 thoughts on “在Python中调用C++,使用SWIG

  1. Lerry

    你好,请问c++代码的文件名是MyObj.h吗?还是需要自己写个.h文件,还有我运行 swig -python -c++ ./myobj.i 为什么没有找到 myobj_wrap.c,谢谢!

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *