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 <iostream> 

#include <Python.h> 

   

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+

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章