前言:
由于学习了python,作为机器人软件工程师方向的我,难免会想将tensorflow 结果数据,传出进行控制的方法,接下来介绍其中一种,C++调用Python!
注意点:
1) 在vs的附加包含目录中添加python的include路径;
2) 在vs Linker的附加库目录中添加python的libs路径;
3) 注意,如果安装的python是64位的,那么vs工程也要是一直对应的x64活动平台,否则会报“无法解析的外部符号 __imp__Py_Initialize”等错误
4) 如果没设置pythonpath,需要在调用Py_SetPythonHome()之前,设置python搜索路径, Py_SetPythonHome("C:\Python27");
C++代码如下(Console应用程式):
1 #include <iostream> 2 #include <Python.h> 3 4 using namespace std; 5 6 void HelloWorld(); 7 void Add(); 8 void TestTransferDict(); 9 void TestClass(); 10 11 int main() 12 { 13 cout << "Starting Test..." << endl; 14 15 cout << "HelloWorld()-------------" << endl; 16 HelloWorld(); 17 cout << "Add()--------------------" << endl; 18 Add(); 19 cout << "TestDict-----------------" << endl; 20 TestTransferDict(); 21 cout << "TestClass----------------" << endl; 22 TestClass(); 23 24 system("pause"); 25 return 0; 26 } 27 28 //调用输出"Hello World"函数 29 void HelloWorld() 30 { 31 Py_Initialize(); //使用python之前,要调用Py_Initialize();这个函数进行初始化 32 PyObject * pModule = NULL; //声明变量 33 PyObject * pFunc = NULL; //声明变量 34 pModule =PyImport_ImportModule("Test001"); //这里是要调用的Python文件名 35 pFunc= PyObject_GetAttrString(pModule, "HelloWorld"); //这里是要调用的函数名 36 PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空 37 Py_Finalize(); //调用Py_Finalize,这个和Py_Initialize相对应的. 38 } 39 40 //调用Add函数,传两个int型参数 41 void Add() 42 { 43 Py_Initialize(); 44 45 PyObject * pModule = NULL; 46 PyObject * pFunc = NULL; 47 pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名 48 pFunc= PyObject_GetAttrString(pModule, "add"); //Add:Python文件中的函数名 49 //创建参数: 50 PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数 51 PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号 i表示创建int型变量 52 PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号 53 //返回值 54 PyObject *pReturn = NULL; 55 pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数 56 //将返回值转换为int类型 57 int result; 58 PyArg_Parse(pReturn, "i", &result); //i表示转换成int型变量 59 cout << "5+7 = " << result << endl; 60 61 Py_Finalize(); 62 } 63 64 //参数传递的类型为字典 65 void TestTransferDict() 66 { 67 Py_Initialize(); 68 69 PyObject * pModule = NULL; 70 PyObject * pFunc = NULL; 71 pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名 72 pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名 73 //创建参数: 74 PyObject *pArgs = PyTuple_New(1); 75 PyObject *pDict = PyDict_New(); //创建字典类型变量 76 PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据 77 PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据 78 PyTuple_SetItem(pArgs, 0, pDict);//0---序号 将字典类型变量添加到参数元组中 79 //返回值 80 PyObject *pReturn = NULL; 81 pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数 82 //处理返回值: 83 int size = PyDict_Size(pReturn); 84 cout << "返回字典的大小为: " << size << endl; 85 PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age"); 86 int newAge; 87 PyArg_Parse(pNewAge, "i", &newAge); 88 cout << "True Age: " << newAge << endl; 89 90 Py_Finalize(); 91 } 92 93 //测试类 94 void TestClass() 95 { 96 Py_Initialize(); 97 98 PyObject * pModule = NULL; 99 PyObject * pFunc = NULL; 100 pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名 101 pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名 102 //获取Person类 103 PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person"); 104 //创建Person类的实例 105 PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL); 106 //调用方法 107 PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty" 108 109 Py_Finalize(); 110 }
Python代码如下:
#test.py def HelloWorld(): print "Hello World" def add(a, b): return a+b def TestDict(dict): print dict dict["Age"] = 17 return dict class Person: def greet(self, greetStr): print greetStr #print add(5,7) #a = raw_input("Enter To Continue...")
运行结果: