c++调用python返回字典

举报
风吹稻花香 发表于 2021/06/05 00:24:41 2021/06/05
【摘要】   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 5...

 

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

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/105821717

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。