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

时间:2022-09-29 10:37:21
可以用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()