前一段时间总结了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++是图像界面)