C++调用Python3.5

20 篇文章 0 订阅

前一段时间总结了C++调用Python2.7,现在由于使用了TensorFlow3,Python从2.7版本变成了3.5,在调用时,本来以为Python2.7和Python3.5没有什么区别,其实还是有点差距的,坑了我好久!

1、VS环境配置

①添加include下文件
如:D:\Anaconda3\include
项目>属性>C/C++>常规>附加包含目录下
②添加libs下文件
如:D:\Anaconda3\libs
1)项目>属性>配置属性>VC++目录>库目录

2)项目>属性>配置属性>链接器>常规>附加库目录

测试代码:

#include "Python.h"    
#include<iostream>    
using namespace std;    
int main()    
{    
    Py_Initialize();    //初始化    
        PyRun_SimpleString("print 'hello'");    
    Py_Finalize();      // 释放资源    
    system("pause");    
}    

我去,竟然出错了,什么鬼?由于python是64版本,所以将解决方案平台定义为‘ X64’。这里没改之前是’WIN32’,修改之后编译可以成功,但是还有其它错误:


出错调试:
python36_d.lib找不到,打开源码,删除即可,或者修改为python36.lib即可(pyconfig.h)

3、C++调用python,来回传参数

def test_add(a, b):  
    print 'add ', a, ' and ', b  
    return 520 
    #return 'hello world'
#include "Python.h"
#include <iostream>
#include<string>
using namespace std;
int main()
{
	Py_Initialize();        // 初始化
	// 模块所在路径
	string chdir_cmd = string("sys.path.append('C:/Users/HQH/Desktop')");
	const char* cstr_cmd = chdir_cmd.c_str();
	//导入sys,添加模块路径
	PyRun_SimpleString("import sys");
	PyRun_SimpleString(cstr_cmd);
	// 加载模块
	//PyObject* moduleName = PyString_FromString("demo"); //模块名,demo.py
	//PyObject* pModule = PyImport_Import(moduleName);    //python2.7加载模块

	PyObject* pModule = PyImport_ImportModule("test");    //python3.5只需要一句话
	//python3.5没有PyString_FromString(有PyUnicode_FromString)
	if (!pModule) // 加载模块失败
	{
		cout << "[ERROR] Python get module failed." << endl;
		int a; cin >> a;
		return 0;
	}
	cout << "[INFO] Python get module succeed." << endl;
	// 加载函数
	PyObject* pv = PyObject_GetAttrString(pModule, "test_add");
	if (!pv || !PyCallable_Check(pv))  // 验证是否加载成功
	{
		cout << "[ERROR] Can't find funftion (test_add)" << endl;
		int a; cin >> a;
		return 0;
	}
	cout << "[INFO] Get function (test_add) succeed." << endl;
	// 设置参数
	PyObject* args = PyTuple_New(2);       // 2个参数
	PyObject* arg1 = PyUnicode_FromString("hello");    // 参数一设为,字符串
	PyObject* arg2 = PyLong_FromLong(520);    // 参数二设为,一个整数,用long表示
	PyTuple_SetItem(args, 0, arg1);
	PyTuple_SetItem(args, 1, arg2);
	// 调用函数
	PyObject* pRet = PyObject_CallObject(pv, args);
	// 获取参数
	if (pRet)  // 验证是否调用成功
	{
		long result = PyLong_AsLong(pRet);
		//string result = PyUnicode_AsUTF8(pRet);     //返回字符串
		cout << "result:" << result << endl;
	}
	Py_Finalize();      // 释放资源
	system("pause");
	return 0;
}

4、MFC中也能实现C++调用python,方法同上。

总结:C++调用Python3.5

①主要就是修改VS的平台版本(32还是64)

②2.7和3.5的区别主要是一些传参函数不同

③传参不能传中文,容易乱码和报错

④模块名不能使用test.py,报错,我也不知道为什么?

⑤其实可以用cmd命令运行.py文件,但是传参怎么实现?可以存入.txt进行文件读取。

⑥C++调用Python使用命令行调用,会出现黑框(特别是C++是图像界面)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值