前期准备:
已安装
Python 3.7.8-64bit(64bit的位数很重要),Visual Studio 2019 & C++,Visual Studio Code,SWIG-4.0.2
下载
SWIG可以在官网www.swig.org下载,解压后将swig.exe的路径添加到环境变量的path中,重启电脑即可使用swig
确认SWIG是否安装完成
win+R --> cmd -->
>swig -help
安装成功
C++代码准备
C++头文件
头文件主要包括:
#include调用(例如#include )
命名空间指定using namespace std;
函数和类的声明
// example.h
#include <iostream>
using namespace std;
class example {
private:
int num;
public:
void say_hello(void);
void change(int din);
int get_num();
};
C++源文件
源文件为头文件中函数和类的实现
// 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后缀文件的封装说明,将c++写得功能方法打包成扁平的接口
%module example
%{
#include "example.h"
%}
%include "example.h"
%module < name >为封装名称,Python通过这个名称加载程序
%{…%}为附加的函数说明和头文件,源文件以外的部分都要包括在这里,包括头文件和宏定义等
之后为要封装的函数或类,可以直接引用头文件(若已经将要封装的部分的声明写在头文件中)
调用swig封装
在命令行中输入swig -python -c++ < swig_config >.i,其中< swig_config >.i为上面写的说明文件
Win+R --> cmd --> cd 当前文件路径
>swig -python -c++ example.i
调用后生成两个文件:
< cpp_source >_wrap.cxx文件
< name >.py文件
模块打包
写一个setup.py文件,放到同一个文件夹下,将接口打包生成一个模块
#!/usr/bin/env python
"""
setup.py file for SWIG C++/Python example
"""
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example.cpp', 'example_wrap.cxx',],
)
setup (name = 'example',
version = '0.1',
author = "zc",
description = """Simple swig C++/Python example""",
ext_modules = [example_module],
py_modules = ["example"],
)
注:这里看到很多人用VS去导出C++的动态链接库,但是自己一直没有成功,要不就是VS生成解决方案失败,要不就是Python调用失败。好像是编译器版本问题,但搜索了很多网页也没有解决,最后看到这个模块打包的方法,可行了就不再在VS上折腾了,又不是真的搞底层的。
运行:
Win+R --> cmd -->cd 当前文件路径
>python setup.py build_ext --inplace
得到一个文件:_example.<python版本号>.pyd
改成:_example.pyd
测试
在当前文件夹中新建一个test.py
print("hello world")
print("hello world")
import example
a = example.example()
a.say_hello()
a.change(3)
print(a.get_num())
输出结果:
但是!这个方法只能将一个cpp转成python扩展包,用这种方法没法儿将多个cpp文件转成cpp各文件内部可互相调用的由一个主cpp负责被调用的python扩展包,linux系统下用的makefile这边也行不通,摸索了很久,最后通过VS配置成功导出,请看(二)。
参考链接
https://www.jianshu.com/p/a257e630fe42
https://blog.csdn.net/qq_42004289/article/details/90634739