C++ 调用 Python 脚本

用的是vs2017 ,Python版本是3.6

Python 部分:

#!/usr/bin/python
#coding:utf-8
#Filename: MyTest.py


def number(numStart, numEnd):
count = 0;
for i in range(numStart, numEnd):
for j in range(numStart, numEnd):
for k in range(numStart, numEnd):
if ((i != j ) and ( j != k) and (i != k)):
count = count + 1
print(i, j, k)

return count



C++ 部分:

#include <iostream>
#include <Python.h>
int main(int argc, char** argv)
{
Py_Initialize(); // 初始化python解释器


if (!Py_IsInitialized()) // 检查是否已经进行了初始化
return -1;


// 设置调用Python文件的路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('E:/Test/python/script')");


// 载入名为MyTest的脚本
PyObject* pModule = PyImport_ImportModule("MyTest");
if (!pModule)
return -1;


// 得到函数名为number的函数
// 方法一
PyObject* pDict = PyModule_GetDict(pModule);
if (!pDict)
return -1;
PyObject* pFunc = PyDict_GetItemString(pDict, "number");
// 方法二
// PyObject* pFunc = PyObject_GetAttrString(pModule, "number");
if (!pFunc || !PyCallable_Check(pFunc))
return -1;


// 设置函数参数
// s 表示字符串,i 表示整型变量,f 表示浮点数,O 表示一个Python对象。
PyObject* pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 5));


// 调用Python函数
PyObject* pRet = pRet = PyObject_CallObject(pFunc, pArgs);


// 将返回值转换成int型
int result = 0;
if (pRet)
PyArg_Parse(pRet, "i", &result);

// 释放Python解释器所占用的资源
Py_Finalize(); 


std::cout << "result: " << result << std::endl;
system("pause");
return 0;
}

按照网上的帖子设置好Python的头文件和链接的python36.lib之后。开始码代码了。开始用了PyString_FromString,一直提示编译不通过,后来查到资料发现PyString_FromString在3的时候已经移除了。所以用PyImport_ImportModule。最坑的是pFunc 取到的值一直为空,试了其他方法,修改了路径都没用。最后在不知道哪篇帖子里发现是文件名的问题,我开始的时候用的Python脚本文件名是test.py, 在Python中有test模块,优先级比我的高,所以查不到我自己写的函数,后来改成Mytest.py问题就解决了。

猜你喜欢

转载自blog.csdn.net/QuanWaiRen0/article/details/80613792