C++ 调用 Python 脚本

用的是vs2017 ,Python版本是3.6

首先配置工程属性:

1.配置管理器

 

2.配置头文件路径

配置python库的include文件路径。include文件在python的安装路径下有,可以直接指向安装路径下的文件,也可以拷贝出来自定义路径。

 

3.配置lib

配置附加库目录。

配置依赖的库。

库在python安装路径下的libs

 

 

然后代码部分:

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问题就解决了。

 

另外有编写好的调用python脚本的代码:https://github.com/PinkZhi/Practice/tree/master/ScriptExe

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值