Windows上Python使用swig调用C++
安装swig和VS
swig是一种可以将C++代码转换为多种脚本语言封装的工具,可以在http://www.swig.org/下载(Windows users should download swigwin-3.0.12 which includes a prebuilt executable. ),解压后将swig.exe的路径添加到环境变量path中即可使用swig。
我是电脑配置是win10,python3.6与VS2017。
C++代码
编写需要在Python中调用的C++代码,最好将函数和类的声明统一放到头文件中,函数和类的实现放到源文件中
头文件example.h
#include <iostream>
using namespace std;
class example {
private:
int num;
public:
void say_hello(void);
void change(int din);
int get_num();
};
源文件example.cpp
#include "example.h"
void example::say_hello(void) {
cout << "hello python,I am C++" << endl;
}
void example::change(int din) {
num = din;
}
int example::get_num(void) {
return num;
}
swig封装
swig封装需要一个.i
后缀文件的封装说明,其中
-
%module <name>
为封装名称,Python调用的包名就是<name>
-
%{...%}
为附加的函数说明和头文件,源文件以外的部分都要包括在这里,包括头文件和宏定义等 - 之后为要封装的函数或类,可以直接引用头文件(若已经将要封装的部分的声明写在头文件中)
example.i
%module Example_swig
%{
#include "example.h"
%}
%include "example.h"
在cmd下执行命令swig -python -c++ example.i
会生成两个文件:example_wrap.cxx和Example_swig.py
使用VS编译
在C++的空工程基础上建立环境,在生成->配置管理器中设置:
-
活动解决方案配置
为Release
-
活动解决方案平台
为X64
(本机为64位机)
在项目->属性
中配置Python的库
- 在
VC++目录
中的包含目录
中,导入Python安装路径下的include路径(包含Python.h)
- 在
链接器->常规
的附加库目录
中,导入Python安装路径下的libs路径
- 另外要在常规->配置类型里选择动态库(.dll)
编译输出
选择生成->生成解决方案
,在x64->Release文件夹下有一个.dll文件,即为编译输出的动态链接库。将其名称改为_<name>.pyd
(本例中为_Example_swig.pyd
),将其与swig生成的<name>.py
文件放在同一目录中.
测试调用
在python里,使用import <name>
即可调用生成的文件(同一目录下)
windows下 tf-pose-estimation 测试安装环境,这里有用到swig,我自己的环境是win10,python3.6,当运行以下语句报错<无法打开包括文件: “numpy/arrayobject.h”: No such file or directory>时,参考https://blog.****.net/as472780551/article/details/83787882,修改C:\workspace\code\tf-pose-estimation-master\tf_pose\pafprocess路径下setup.py中添加一句include_dirs=[np.get_include()]即可
swig -python -c++ pafprocess.i && python setup.py build_ext --inplace
from distutils.core import setup, Extension
import numpy
import os
# os.environ['CC'] = 'g++';
setup(name='pafprocess_ext', version='1.0',
ext_modules=[
Extension('_pafprocess', ['pafprocess.cpp', 'pafprocess.i'],
swig_opts=['-c++'],
depends=["pafprocess.h"],
include_dirs=[numpy.get_include(), '.'])
],
include_dirs=[numpy.get_include()],
py_modules=[
"pafprocess"
]
)
参考资料:
Windows平台下Python使用swig调用C++:https://www.jianshu.com/p/a257e630fe42