CPython类型互换
从Python到C的转换⽤PyArg_Parse*系列函数,int PyArg_ParseTuple():把Python传过来的参数转为C;int
PyArg_ParseTupleAndKeywords()与PyArg_ParseTuple()作⽤相同,但是同时解析关键字参数;它们的⽤法跟C的sscanf函数很像,都接受⼀个字符串流,并根据⼀个指定的格式字符串进⾏解析,把结果放⼊到相应的指针所指的变量中去,它们的返回值为1表⽰解析成功,返回值为0表⽰失败。
从C到Python的转换函数是PyObject* Py_BuildValue():把C的数据转为Python的⼀个对象或⼀组对象,然后返回之;Py_BuildValue 的⽤法跟sprintf很像,把所有的参数按格式字符串所指定的格式转换成⼀个Python的对象。
C与Python之间数据转换的转换代码:
1 #include "stdafx.h"
2 #include "python.h"
3
4
5int _tmain(int argc, _TCHAR* argv[])
6 {
7 Py_Initialize();
8
9if (!Py_IsInitialized())
10 {
11 printf("initialization fail!");
12return -1;
13 }
14
15 PyRun_SimpleString("import sys");
16 PyRun_SimpleString("sys.path.append('./')");
python的类怎么输出printf
17
18 PyObject *pModule = NULL, *pDict = NULL, *pFunc = NULL, *pArg = NULL, *result = NULL;
19
20 pModule = PyImport_ImportModule("demo"); //引⼊模块
21
22if (!pModule)
23 {
24 printf("import module fail!");
25return -2;
26 }
27
28 pDict = PyModule_GetDict(pModule); //获取模块字典属性 //相当于Python模块对象的__dict__ 属性
29if (!pDict)
30 {
31 printf("find dictionary fail!");
32return -3;
33 }
34
35 pFunc = PyDict_GetItemString(pDict, "add"); //从字典属性中获取函数
36if (!pFunc || !PyCallable_Check(pFunc))
37 {
38 printf("find function fail!");
39return -4;
40 }
41
42/*
43 // 参数进栈
44 *pArgs;
45 pArgs = PyTuple_New(2);
46
47 PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3));
48 PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));
49*/
50
51 pArg = Py_BuildValue("(i, i)", 1, 2); //参数类型转换,传递两个整型参数
52 result = PyEval_CallObject(pFunc, pArg); //调⽤函数,并得到python类型的返回值53
54int sum;
55 PyArg_Parse(result, "i", &sum); //将python类型的返回值转换为c/c++类型
56 printf("sum=%d\n", sum);
57
58 PyRun_SimpleString("print 'hello world!' ");
59
60 Py_DecRef(pModule);
61 Py_DecRef(pDict);
62 Py_DecRef(pFunc);
63 Py_DecRef(pArg);
64 Py_DecRef(result);
65
66
67 Py_Finalize();
68
69 getchar();
70return0;
71 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论