C++调用Python及间接调用Python三方库

本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库

 

1.移植Python解释器

Python环境的目录结构

红色部分是生成路径下解释器运行时依赖
将红色部分拷贝到C++编译主ExE路径下即可,并把需要允许的py文件页考过去(也就是.py文件需和编译生成的.exe文件放在一起)

蓝色部分是VS配置编译时依赖,需要添加到vs工程的环境中

除此之外,也可以指定环境:

读取python文件位置   

程序最终发布的时候,不需要在客户端机上安装python,只需要拷贝python文件的libs,lib库,include文件夹,dll文件夹等到安装目录下,并使用

Py_SetPythonHome((char*)strPythonLibPath.c_str());指定查找路径

2.VS配置

在vs中进行配置

3.实例

python程序

def testReturn1(s1, s2):
   s = s1+s2
   return s
 
def testReturn2(s1):
   return s1

C++程序

//***python调用***//
	//初始化python模块
	Py_Initialize();
	// 检查初始化是否成功  
	if (!Py_IsInitialized())
	{
		cout << "初始化失败" << endl;
		Py_Finalize();
	}

	PyObject *pModule= PyImport_ImportModule("helloworld");//Python文件名     
	if (!pModule) 
	{
		cout << "py文件导入失败" << endl;
		Py_Finalize();
	}
	else 
	{
		PyObject*pFunc = PyObject_GetAttrString(pModule, "testReturn1");//Python文件中的函数名  
		if (!pFunc) {
			cout << "函数导入失败" << endl;
			Py_Finalize();
		}

		PyObject *pyParams1 = PyTuple_New(2);
		PyTuple_SetItem(pyParams1, 0, Py_BuildValue("s", "hello "));
		PyTuple_SetItem(pyParams1, 1, Py_BuildValue("s", "python"));

		char * result1;
		PyObject*pArg = PyEval_CallObject(pFunc, pyParams1);//调用函数
		PyArg_Parse(pArg, "s", &result1);
		cout << result1 << endl;



		pFunc = PyObject_GetAttrString(pModule, "testReturn2");//Python文件中的函数名  
		if (!pFunc) {
			cout << "函数导入失败" << endl;
			Py_Finalize();
		}
		PyObject* pyParams3 = Py_BuildValue("(i)", 123);
		int result2;
		pArg = PyEval_CallObject(pFunc, pyParams3);//调用函数
		PyArg_Parse(pArg, "i", &result2);
		cout << result2 << endl;

	}

结果

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值