前言:
在做一个项目时,需要在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
结尾:这个配置只是最简单的测试了下连接的可行性,后续测试还没有做。欢迎学习交流,如有错误,欢迎留言批评指正