C++工程调用Python脚本环境配置
前言:
在做一个项目时,需要在c++工程中调用python脚本并获得返回值。
所以选择先做一个demo来进行链接,但是在环境配置时遇到了很多的问题,也踩了不少坑。
网上教程比较零散,现将成功链接的最简单配置方法记录
注:
用anaconda中的python环境进行配置时总是缺文件,或找不到路径。所以这里我新装了3.8.10版本python进行测试。
vs配置anaconda中python环境目前还没找到解决方案
Python3.8.10下载:
https://www.python.org/downloads/release/python-3810/
Step1.导入#include<Python.h>
这时我们发现报错,如图所示
解决方法:右键项目打开工程属性
请注意:这里我们配置的平台是x64
Step2.c++常规附加包含目录添加Python路径下的include文件
Step3.vc++目录可执行文件目录和库目录分别添加include和libs文件夹
此时发现#include<Python.h>已经不报错。
Step4.写一段测试代码;
首先是python代码:
#做一个相加函数
def Add(a, b): return a + b
存为demo.py文件后放在工程目录下,无需编译
然后是c++代码:
#include<Python.h> #include<iostream> using namespace std; int main() { Py_Initialize(); PyObject* pModule = NULL; PyObject* pFunc = NULL; PyObject* pName = NULL; //2、初始化python系统文件路径,保证可以访问到 .py文件 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); //3、调用python文件名。当前的测试python文件名是demo.py。在使用这个函数的时候,只需要写文件的名称就可以了。不用写后缀。 pModule = PyImport_ImportModule("demo"); //4、调用函数 pFunc = PyObject_GetAttrString(pModule, "Add"); //5、给python传参数 PyObject* pArgs = PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数。如果AdditionFc中只有一个参数时,写1就可以了。这里只先介绍函数必须有参数存在的情况。 PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2)); //0:表示序号。第一个参数。 PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4)); //1:也表示序号。第二个参数。i:表示传入的参数类型是int类型。 //6、使用C++的python接口调用该函数 PyObject* pReturn = PyEval_CallObject(pFunc, pArgs); //7、接收python计算好的返回值 int nResult; PyArg_Parse(pReturn, "i", &nResult);//i表示转换成int型变量。在这里,最需要注意的是:PyArg_Parse的最后一个参数,必须加上“&”符号。 cout << nResult; //8、结束python接口初始化 Py_Finalize(); return 0; }
Step5.运行c++程序,发现报错:
解决方法:由于各种原因系统删掉了python38_d.dll,在python安装路径下找到python38_d.dll复制粘贴到到C:\Windows\System32\
Step6:再次运行
已经可以运行,并得到了运行结果2+4=6
结尾:这个配置只是最简单的测试了下连接的可行性,后续测试还没有做。欢迎学习交流,如有错误,欢迎留言批评指正