1 原始文件
编写好原始的h和cpp文件,示例如下:
//File: Tool.h int fuc1(); int fuc2(); //File: Tool.cpp #include <iostream> using namespace std ; //File: Tool.cpp int fuc1() { cout<<"test---fuc1"<<endl; return 0 ; } int fuc2() { cout<<"test---fuc2"<<endl; return 0; }
2 编写.i接口文件
新增加文件Tool.i,内容如下:
//File: Tool.i %module Tool %{ #define SWIG_FILE_WITH_INIT #include "Tool.h" %} int fuc1() ; int fuc2() ;
.i接口文件中主要包含了三个部分:
%module
后面的名字是被封装的模块名称,Python通过这个名称加载程序。%{...%}
之间所添加的内容,一般包含此文件需要的一些函数声明和头文件。- 最后一部分,声明了要封装的函数和变量。
如果把要封装的函数声明部分写在了头文件里,最后一部分直接用%include
包含头文件名也行:
//File: Tool.i %module Tool %{ #define SWIG_FILE_WITH_INIT #include "Tool.h" %} %include "Tool.h"
两种.i文件的效果是一样的,比较建议使用第二种方法,能够简化接口文件
3 生成动态链接库
编写setup.py文件,用于自动化编译动态链接库:
#File: setup.py from distutils.core import setup, Extension #生成一个扩展模块 pht_module = Extension('_Tool', #模块名称,必须要有下划线 sources=['Tool_wrap.cxx', #封装后的接口cxx文件 'Tool.cpp' #以下为原始代码所依赖的文件 ], ) setup(name = 'Tool', #打包后的名称 version = '0.1', author = 'SWIG Docs', description = 'Simple swig pht from docs', ext_modules = [pht_module], #与上面的扩展模块名称一致 py_modules = ['Tool'], #需要打包的模块列表 )
编写完成后执行以下命令进行编译:
swig -python -c++ Tool.i && python setup.py build_ext --inplace
编译通过后在当前目录下即可见到编译好的Python库文件:_Tool.cpython-35m-x86_64-linux-gnu.so, Tool.py ,和Tool_wrap.cxx,相当于将原cpp文件进行了封装,wrap了一层, 编译成了Python库
4 在Python加载库
编写 test.py 文件通过以下方式调用所生成的动态链接库即可:
import Tool Tool.fuc1() Tool.fuc2()