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

可以使用Python提供的"C API"来实现C++调用Python的功能。以下是一个简单的示例,展示了如何在C++调用Python代码: ```cpp #include <Python.h> int main() { // 初始化Python解释器 Py_Initialize(); // 加载Python模块 PyObject* pModule = PyImport_ImportModule("test"); // 获取Python函数对象 PyObject* pFunc = PyObject_GetAttrString(pModule, "test_func"); // 调用Python函数 PyObject* pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "Hello from C++!")); PyObject* pResult = PyObject_CallObject(pFunc, pArgs); // 打印Python函数返回值 char* result; PyArg_Parse(pResult, "s", &result); printf("%s\n", result); // 释放资源 Py_DECREF(pModule); Py_DECREF(pFunc); Py_DECREF(pArgs); Py_DECREF(pResult); // 关闭Python解释器 Py_Finalize(); return 0; } ``` 在上面的示例中,我们首先使用`Py_Initialize()`初始化Python解释器,然后使用`PyImport_ImportModule()`加载名为"test"的Python模块。接着,我们使用`PyObject_GetAttrString()`获取模块中名为"test_func"的函数对象,然后使用`PyObject_CallObject()`调用该函数。最后,我们通过`PyArg_Parse()`获取函数返回值,并使用`printf()`打印出来。 需要注意的是,上述示例中调用Python函数必须满足以下条件: - 函数的参数和返回值类型必须为Python支持的类型,例如字符串、整数、列表、字典等; - 函数名和模块名必须与C++代码中使用的一致; - Python解释器必须在C++代码中正确初始化和关闭; - C++代码必须正确处理Python函数返回的对象,并在不使用时释放相应的资源。 如果你需要在C++代码中频繁地调用Python函数,可以考虑使用Boost.Python或pybind11等第三方库来简化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值