一、说明
有时候一个功能用C++实现是困难的,但是用python实现却很简单。二者如果能混合使用,相互协调,岂不美滋滋。
本文中,笔者将讲述如何在Visual Stdio 2019(其他版本应该也通用)中搭建C++调用python程序的环境
C++调用python语法可参考如下博客:
- https://blog.csdn.net/itas109/article/details/78733478
- https://blog.csdn.net/nynyvkhhiiii/article/details/17525865
QT C++调用python可参考笔者[另一篇文章]
二、实验环境
- 操作系统:windows 10 64位
- IDE:Visual Stdio 2019 Community
- Python版本:3.7 64位
三、添加python环境变量
- *找到python的安装目录,笔者这里是C:\Users\ASUS\AppData\Local\Programs\Python\Python37\*
注:务必确保Visual Stdio中C++调用python时使用的是此目录中的python环境,否则可能出现无法成功运行、无法调用第三方库等情况
- 添加环境变量(此电脑-右键-属性-高级系统设置-高级-环境变量-系统变量-双击path-新建)
- 环境变量1:C:\Users\ASUS\AppData\Local\Programs\Python\Python37\
- 环境变量2:C:\Users\ASUS\AppData\Local\Programs\Python\Python37\Scripts
四、环境搭建
- 打开Visual Stdio,新建C++ 空项目,命名自定义就好
- 配置Visual Stdio Debug环境
- 调整Visual Stdio为debug模式,由于python为64位,故调试器选择64位
- VS - 项目 - 右键 - 属性 - C/C++ - 常规 - 附加包含目录
- 构建debug版本python静态链接库
进入路径C:\Users\ASUS\AppData\Local\Programs\Python\Python37\libs\,复制并原路径粘贴“python3.lib”和“python37.lib”产生副本
修改副本名称,”python3 - 副本.lib”重命名为“python3_d.lib” ; “python37 - 副本.lib”重命名为“python37_d.lib” - VS - 项目 - 右键 - 属性 - 链接器 - 常规 - 附加库目录
- VS - 项目 - 右键 - 属性 - 链接器 - 输入 -附加依赖项(此处与debug版本设置不同)
- 配置Visual Stdio Release环境,与Debug环境配置相似,但不完全一样
- 调整Visual Stdio为Release模式,由于python为64位,故调试器选择64位
- VS - 项目 - 右键 - 属性 - C/C++ - 常规 - 附加包含目录
- VS - 项目 - 右键 - 属性 - 链接器 - 常规 - 附加库目录
- VS - 项目 - 右键 - 属性 - 链接器 - 输入 -附加依赖项
五、环境验证
- 新建源文件test.cpp,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using namespace std;
int main()
{
//初始化python模块
Py_Initialize();
if (!Py_IsInitialized())
{
exit(1);
}
PyRun_SimpleStringFlags("print('hello C++ and python ! --from C++ Python37_64')", 0); //执行python的pint函数
Py_Finalize();
return 0;
} - Visual Stdio选择Debug x64,运行
- Visual Stdio选择Release x64,运行
- 如果Debug和Release模式下都能正常执行,说明环境搭建完毕
五、注意事项
- 发布Release版本,应该复制C:\Users\ASUS\AppData\Local\Programs\Python\Python37\python37.dll,与目标可执行文件(*.exe)放在同一目录
- 发布Debug版本,应该复制C:\Users\ASUS\AppData\Local\Programs\Python\Python37\python37.dll,重命名为python37_d.dll,与目标可执行文件(*.exe)放在同一目录