Python通过PyArg_ParseTuple将函数参数传递给C语言模块接口函数
C语言函数通过Py_BuildValue创建接口函数的返回值对象给Python
关于这两个函数的具体使用说明,可以参考官方文档:
PyArg_ParseTuple使用举例:
- int i;
- long j;
- char *s;
- PyArg_ParseTuple(args,"ils", &i, &j, &s);
常用的几个解析参数与C类型的对应关系:
s:char*
b:unsigned char
c:char
d:double
f:float
h:short int
i:int
l:long
k:unsigned long
L:long long
K:unsigned long long
需要注意的是:使用PyArg_ParseTuple获取一个来自于Python传递的字符串类型(char *)的参数时,传递的是一个指向指针的指针,也就是说PyArg_ParseTuple会修改s所指向的位置,该位置上会保存Python传递的字符串,并且该位置由Python维护,C函数不能主动将其释放。
Py_BuildValue使用举例:
- Py_BuildValue("") None
-
- Py_BuildValue("i", 123) 123
-
- Py_BuildValue("iii", 123, 456, 789) (123, 456, 789)
-
- Py_BuildValue("s", "hi") 'hi'
-
- Py_BuildValue("ss", "good", "morning") ('good', 'morning')
-
- Py_BuildValue("s#", "hello", 4) 'hell'
-
- Py_BuildValue("()") ()
-
- Py_BuildValue("(i)", 123) (123,)
-
- Py_BuildValue("(ii)", 123, 456) (123, 456)
-
- Py_BuildValue("(i,i)", 123, 456) (123, 456)
-
- Py_BuildValue("[i,i]", 123, 456) [123, 456]
-
- Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) {'abc': 123, 'def': 456}
-
- Py_BuildValue("((ii)(ii)) (ii)", 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))
需要注意的是:使用Py_BuildValue构建返回值时,如果C函数通过malloc分配了内存空间并用于构建Py_BuildValue,那么当构建完成后,需要C函数调用free释放内存空间。