使用SWIG实现Python调用C/C++代码

匿名 (未验证) 提交于 2019-12-02 22:54:36
可以用SWIG来把C++的代码封装成Python库,供Python调用。


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接口文件中主要包含了三个部分:

  1. %module后面的名字是被封装的模块名称,Python通过这个名称加载程序。
  2. %{...%}之间所添加的内容,一般包含此文件需要的一些函数声明和头文件。
  3. 最后一部分,声明了要封装的函数和变量。

如果把要封装的函数声明部分写在了头文件里,最后一部分直接用%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() 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!