近来因为工作需要需要在需要在python中调用c/c++代码的方式,网上搜索了下有许多方法,结合网上资料自己总结了下。
如下直接说适用方法。
1.适用swig进行该方法的处理。方法步骤:
a,下载swig源码包
http://www.swig.org/survey.html
b,解压swig安装包,解压并进行安装。
tar -xvf swig-3.0.12.tar.gz
./configure --prefix=/usr/localswig(此处指定安装目录,不指定默认直接默认系统路径)
(如果执行这不成功,缺少prce错误,说明缺少对应的文件,需要安装对应库,
个人使用的是乌班图,安装法:apt-get install pcre-dev,或者下载源码包进行安装即可
)
make && make install
至此,swig安装完成。
2,使用举例
python中调用c/c++代码使用方法。
a, c++代码:
//test.h
int add(int a,int b);
int sub(int a,int b);
//test.cpp
int add(){ return a+ b;} int sub(int a,int b){ return a - b;}
编辑test.i文件
使用如下的方法编写.i文件(***********)
//%module 后面的名字是被封装的模块名称。封装口,python通过这个名称加载程序
//%{ %}之间所添加的内容,一般包含此文件需要的一些函数声明和头文件。
//最后一部分,声明了要封装的函数和变量,直接使用%include 文件模块头文件直接包含即可
b, //file test.i
%module test
%{
#define SWIG_WITH_INIT
#include "test.h"
%}
%include "test.h "
c.执行命令编辑.i文件
swig -python -c++ test.i
此时会生成对应的文件: 模块名_warp.cxx
利用python提供的自动化编译模块进行编译。编写一个编译文件setup.py
内容如下:(仅供参考,具体详细了解python自动化编译动态链接库文档)
#生成一个扩展模块
test_module = Extension('_test', #模块名称,必须要有下划线
sources=['test_wrap.cxx', #封装后的接口cxx文件
'test.cpp'],
)
setup(name = 'test', #打包后的名称
version = '0.1',
author = 'SWIG Docs',
description = 'Simple swig pht from docs',
ext_modules = [test_module], #与上面的扩展模块名称一致
py_modules = ['test'], #需要打包的模块列表
)
利用python的执行setup.py文件
python setup.py build 编译生成对应库,可供python直接调用的模块
实现过程如下所示:test模块为通过编译c++代码生成test模块,前面已经介绍c++代码示例:
>>> import test
>>> test.add(1,2)
3
>>> test.sub(4,2)
2
>>>