回顾(一):上一次的封装是用python自带的distutils,通过编写setup.py生成关于c++内容的python包,这次使用VS2019做配置导出python拓展包
C++代码准备
注:前期准备如(一)所示。
C++扩展包文件
C++扩展包文件是名为example
的cpp和h文件,这个文件会被导出成python扩展包在python中调用,其中
C++头文件
// example.h
#include "aaa.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;
aaa aaa;
aaa.say_hello();
}
void example::change(int din) {
num = din;
}
int example::get_num(void) {
return num;
}
纵观两个文件代码,发现其中调用了“aaa.h
”这个头文件,这里就要引出被扩展包文件调用的另一对名为aaa
的cpp和h文件了。
C++扩展包调用文件
“C++扩展包调用文件”就是上述“被C++扩展包文件调用”的名为aaa
的cpp和h文件了,这里虽然只提及了一个文件,但是可以创建多个,“C++扩展包调用文件”个数可以任意。
C++头文件
// aaa.h
#pragma once
#include <iostream>
using namespace std;
class aaa {
public:
void say_hello(void);
};
C++源文件
// aaa.cpp
#include "aaa.h"
void aaa::say_hello(void) {
cout << "hello python,I am C++" << endl;
}
导入VS2019
新建VS空项目
将上述准备好的文件复制到建立的项目中
将文件导入项目中
创建SWIG封装说明文件
右键点击“exampleOutput
”或者解决方案资源管理器界面内空白处,新建一个.i文件,内容和名字与(一)中所述相同。
VS属性配置
重要!!!!!极其重要!!!!!
容易出错!!!!
步骤一
首先,因为我装的python是64bit的,所以这里要改成Release + x64
,如果你装的是32位的要改成win32或者x86,Release不变!
项目 右键属性进入属性页开始配置
步骤二
因为python3.7适用的对应编译器是VC141,编译器版本可以上网查到,因此,在VS2019的环境下不能用其默认的平台工具集,将Windows SDK版本设置成自己下拉框有的随便一个版本,不要用“10.0更新到最新版本”(为什么不要我也不知道,运行的时候报错了),平台工具集在安装了vs2017(v141)以后选入,配置类型选择“动态库”。
至于如何安装 平台工具集 …
打开 Visual Studio installer,点击修改(modify),搜索vc,安装 MSVC v141(注意后缀)。
步骤三
配置python的对应版本include和lib路径,并将“输出文件”改成“_example.pyd
”,注意模块名前的下滑线和模块名。
输入项加一个python3.lib
点击“确定”,结束属性页配置。
编译接口文件
example.i 文件右键属性 -> 配置属性 -> 常规 -> 项类型 选中 自定义生成工具 然后 确定
再重新右键属性打开,在自定义生成工具 -> 常规 -> 命令行 添加 swig.exe -c++ -python "%(FullPath)"
输出 中 添加 $(InputName)_wrap.cxx
点击 确定
example.i 文件右键编译,文件夹中将生成xxxxxx_wrap.cxx
的文件,这里是example_wrap.cxx
将其加入到项目中
对整个项目点击生成,没有问题的话就会在文件夹中看到pyd扩展包了
测试
在当前文件夹中新建一个test.py
print("hello world")
print("hello world")
import example
a = example.example()
a.say_hello()
a.change(3)
print(a.get_num())
运行成功
参考链接
https://blog.csdn.net/GEANNACAO/article/details/115582827
https://www.cnblogs.com/guolongzheng/p/12145254.html