首页 > 程序开发 > Web开发 > Python >

Python Ctypes结构体指针处理(函数参数,函数返回)

2011-09-30

C函数需要传递结构体指针是常事,但是和Python交互就有点麻烦事了,经过研究也可以了。<结构体指针作为函数参数>来看下C测试例子:view plainprint?#include <stdio.h>typedef struct StructPointerTest* St...

C函数需要传递结构体指针是常事,但是和Python交互就有点麻烦事了,经过研究也可以了。
<结构体指针作为函数参数>
来看下C测试例子:
view plainprint?
#include <stdio.h>
typedef struct StructPointerTest* StructPointer;
struct StructPointerTest{
int x;
int y;
};
void test(StructPointer p) {
p->x = 101;
p->y = 201;
}

这里test里面需要传入结构体指针,函数中的实现很简单,就是改变x 和 y 的值这个函数将被python调用。
使用Python调用时,需要模拟申明个结构体(class):
view plainprint?
from ctypes import *
class StructPointerTest(Structure):
_fields_ =[(&#39;x&#39;, c_int),
(&#39;y&#39;, c_int)]

Usage:
view plainprint?
##Structure Pointer Operation
SPTobj = pointer(StructPointerTest(1, 2))
print SPTobj
print SPTobj.contents.x
print SPTobj.contents.y

<函数返回结构体指针>
C函数测试例子改成如下:
view plainprint?
StructPointer test() {
StructPointer p = (StructPointer)malloc(sizeof(struct StructPointerTest));
p->x = 101;
p->y = 201;
return p;
}

Python程序处理如下:
view plainprint?
from ctypes import *
class StructPointer(Structure):
pass

StructPointer._fields_=[(&#39;x&#39;, c_int),
(&#39;y&#39;, c_int),
(&#39;next&#39;, POINTER(StructPointer))]


lib = cdll.LoadLibrary(&#39;./StructPointer.so&#39;)
lib.test.restype = POINTER(StructPointer)

p = lib.test()
print p.contents.x

关于resttype可以参见 Tutorial : By default functions are assumed to return the C int type. Other return types can be specified by setting the restype attribute of the function object.

作者“Crazybaby&#39;s blog”

相关文章
最新文章
热点推荐