c++調用python返回字典
C++調Python,代碼粘貼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include
#include
using namespace std;
void HelloWorld();
void Add();
void TestTransferDict();
void TestClass();
int?main()
{
cout <"Starting Test..."?<< endl;
cout <"HelloWorld()-------------"?<< endl;
HelloWorld();
cout <"Add()--------------------"?<< endl;
Add();
cout <"TestDict-----------------"?<< endl;
TestTransferDict();
cout <"TestClass----------------"?<< endl;
TestClass();
system("pause");
return?0;
}
//調用輸出"Hello World"函數
void HelloWorld()
{
Py_Initialize();??????????????//使用python之前,要調用Py_Initialize();這個函數進行初始化
PyObject?*?pModule?=?NULL;????//聲明變量
PyObject?*?pFunc?=?NULL;??????//聲明變量
pModule?=PyImport_ImportModule("Test001");??????????????//這里是要調用的Python文件名
pFunc=?PyObject_GetAttrString(pModule,?"HelloWorld");???//這里是要調用的函數名
PyEval_CallObject(pFunc, NULL);?????????????????????????//調用函數,NULL表示參數為空
Py_Finalize();????????????????//調用Py_Finalize,這個和Py_Initialize相對應的.
}
//調用Add函數,傳兩個int型參數
void Add()
{
Py_Initialize();
PyObject?*?pModule?=?NULL;
PyObject?*?pFunc?=?NULL;
pModule?=PyImport_ImportModule("Test001");??????//Test001:Python文件名
pFunc=?PyObject_GetAttrString(pModule,?"add");??//Add:Python文件中的函數名
//創建參數:
PyObject?*pArgs?=?PyTuple_New(2);???????????????//函數調用的參數傳遞均是以元組的形式打包的,2表示參數個數
PyTuple_SetItem(pArgs,?0, Py_BuildValue("i",?5));//0---序號? i表示創建int型變量
PyTuple_SetItem(pArgs,?1, Py_BuildValue("i",?7));//1---序號
//返回值
PyObject?*pReturn?=?NULL;
pReturn?=?PyEval_CallObject(pFunc, pArgs);??????//調用函數
//將返回值轉換為int類型
int?result;
PyArg_Parse(pReturn,?"i", &result);????//i表示轉換成int型變量
cout <"5+7 = "?<< result << endl;
Py_Finalize();
}
//參數傳遞的類型為字典
void TestTransferDict()
{
Py_Initialize();
PyObject?*?pModule?=?NULL;
PyObject?*?pFunc?=?NULL;
pModule?=PyImport_ImportModule("Test001");??????//Test001:Python文件名
pFunc=?PyObject_GetAttrString(pModule,?"TestDict");?//Add:Python文件中的函數名
//創建參數:
PyObject?*pArgs?=?PyTuple_New(1);
PyObject?*pDict?=?PyDict_New();???//創建字典類型變量
PyDict_SetItemString(pDict,?"Name", Py_BuildValue("s",?"WangYao"));?//往字典類型變量中填充數據
PyDict_SetItemString(pDict,?"Age", Py_BuildValue("i",?25));?????????//往字典類型變量中填充數據
PyTuple_SetItem(pArgs,?0, pDict);//0---序號? 將字典類型變量添加到參數元組中
//返回值
PyObject?*pReturn?=?NULL;
pReturn?=?PyEval_CallObject(pFunc, pArgs);??????//調用函數
//處理返回值:
int?size?=?PyDict_Size(pReturn);
cout <"返回字典的大小為: "?<< size << endl;
PyObject?*pNewAge?=?PyDict_GetItemString(pReturn,?"Age");
int?newAge;
PyArg_Parse(pNewAge,?"i", &newAge);
cout <"True Age: "?<< newAge << endl;
Py_Finalize();
}
//測試類
void TestClass()
{
Py_Initialize();
PyObject?*?pModule?=?NULL;
PyObject?*?pFunc?=?NULL;
pModule?=PyImport_ImportModule("Test001");??????//Test001:Python文件名
pFunc=?PyObject_GetAttrString(pModule,?"TestDict");?//Add:Python文件中的函數名
//獲取Person類
PyObject?*pClassPerson?=?PyObject_GetAttrString(pModule,?"Person");
//創建Person類的實例
PyObject?*pInstancePerson?=?PyInstance_New(pClassPerson, NULL, NULL);
//調用方法
PyObject_CallMethod(pInstancePerson,?"greet",?"s",?"Hello Kitty");???//s表示傳遞的是字符串,值為"Hello Kitty"
Py_Finalize();
}
Python代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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...")
運行結果:
第一步還是包含頭文件
第二步,使用python之前,要調用Py_Initialize();這個函數進行初始化。
幫助文檔中如是說:
The basic initialization function is Py_Initialize(). This initializes the table of loaded modules, and creates the fundamental modules __builtin__, __main__, sys, and exceptions. It also initializes the module search path (sys.path).
反正,一開始你一定要調用。
第三步,聲明一些Python的變量,PyObject類型的。其實聲明也可放在前面,這個倒是無所謂的。
第四步,import module,也就是你的腳本名字,不需要加后綴名,否則會出錯的。
第五步,從你import進來的module中得到你要的函數
pFunc?? = PyObject_GetAttrString(pModule, "函數名");
上面的例子已經夠清楚的了,最后一個是你要得到的函數的名字
第六步,調用PyEval_CallObject來執行你的函數,第二個參數為我們要調用的函數的函數。
第七步,調用Py_Finalize,這個根Py_Initialize相對應的。一個在最前面,一個在最后面。
注意事項:
1.若編譯Debug版,請將C:/Python26/libs下的python26.lib復制一份改名為python26_d.lib
原博地址:http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html
另外還有一篇寫的很好,地址:https://www.cnblogs.com/earvin/p/5423868.html
C++ Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。