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,否则老是报错。????高人指点下




posted on   wangyao1052  阅读(20000)  评论(5编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2012年2月 >
29 30 31 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 1 2 3
4 5 6 7 8 9 10

导航

统计

点击右上角即可分享
微信分享提示