c++调用python返回字典

网友投稿 1133 2022-05-30

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

c++调用python返回字典

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小时内删除侵权内容。

上一篇:小白爬虫第四弹之爬虫快跑(多进程 + 多线程)
下一篇:字节码编程,Byte-buddy篇三《使用委托实现抽象类方法并注入自定义注解信息》
相关文章