C++調Python示例


由於項目需要,最近幾天都在研究怎么用C++調Python,現將這幾天實驗的代碼粘貼如下:

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...")

運行結果:

注意事項:

1.若編譯Debug版,請將C:/Python26/libs下的python26.lib復制一份改名為python26_d.lib

2.很奇怪,不能將python文件的名字命名為test.py,否則老是報錯。????高人指點下





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM