最近的项目涉及到用c++调取python文件,就此写下一篇文章记录自己的操作,供以后参考学习。
环境配置:python3.6.4+vs2017
首先需要将python的头文件等一系列包到入到VS中,需要进行配置VS,配置方法如下:右键工程项目点击属性,VC++目录---包含目录----(选择python安装目录下的libs文件和include文件,此处用的是anaconda环境,也同理),VC++目录---库目录--python目录的libs文件
添加:链接器--输入--pythonxx_d.lib文件名称,
此处注意,若为debug配置,则是添加pythonxx_d.lib文件名称,若为release配置,则是添加pythonxx.lib文件名称。
要调用的python的demo代码和运行结果如下:
def test():
print("2019--2020赛季NBA西部球队排名:\n")
team = ["火箭","勇士","雷霆","湖人","马刺","森林狼","76人","鹈鹕","爵士"]
for index,item in enumerate(team):
if index%2 == 0:
print(item +"\t\t",end = '')
else:
print(item + "\n") #换行输出
print("信息学院311")
test()
c++调用的代码如下(一定要导入python头文件):
#include<stdio.h>
#include <Python.h>
int main()
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;
//待传参数
int time[6] = { 1,2,3,4,5,6 };
//初始化python
Py_Initialize();
// 检查初始化是否成功
if (!Py_IsInitialized())
{
printf("初始化失败\n");
Py_Finalize();
}
//设置python模块,搜寻位置,文件放在.c文件一起
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('F:/python_practice/')");
//获取python文件名,导入模块(我这里的py文件是nba.py)
pModule = PyImport_ImportModule("nba");
if (!pModule) {
printf("py文件导入失败\n");
Py_Finalize();
}
else {
//直接获取模块中的函数
pFunc = PyObject_GetAttrString(pModule, "test");
//验证函数是否获取成功
if (!pFunc) {
printf("函数导入失败\n");
Py_Finalize();
}
//将c/c++类型数据转换为python类型,利用元组传递
pArgs = PyTuple_New(6);
pValue = PyLong_FromLong(time[0]);
PyTuple_SetItem(pArgs, 0, pValue);
pValue = PyLong_FromLong(time[1]);
PyTuple_SetItem(pArgs, 1, pValue);
pValue = PyLong_FromLong(time[2]);
PyTuple_SetItem(pArgs, 2, pValue);
pValue = PyLong_FromLong(time[3]);
PyTuple_SetItem(pArgs, 3, pValue);
pValue = PyLong_FromLong(time[4]);
PyTuple_SetItem(pArgs, 4, pValue);
pValue = PyLong_FromLong(time[5]);
PyTuple_SetItem(pArgs, 5, pValue);
//调用直接获得的函数,并传递参数
pValue = PyObject_CallObject(pFunc, pArgs);
//释放python
Py_Finalize();
printf("success");
return 0;
}
}
结果如下:
更多推荐
c++调用python
发布评论