2020年12月4日 / 719次阅读 / Last Modified 2020年12月4日
ctypes
本文依然作为详解ctypes模块及如何调用C函数的补充。补充一个更简单和通用的获取C函数返回指针的方法。
不管用哪种方式,在Python代码中要获取C函数返回的指针,都要事先确定指针所指向的这块内存的大小。《详解ctypes模块及如何调用C函数》此文介绍了获取返回结构体指针的一种方法。本文继续使用相同的C函数,介绍另一种更简单和通用的方法。
C函数代码如下:
#include
#include
typedef struct {
int a;
int b;
float c;
} abc;
abc *init(int a, int b, float c)
{
abc *pt;
pt = (abc *)malloc(sizeof(abc));
pt->a = a;
pt->b = b;
pt->c = c;
return pt;
}
void destroy(abc *pt)
{
free(pt);
}
abc结构体的sizeof值为12。我们先编译成ccc.so文件,略。
下面是Python代码:
import struct
from ctypes import *
cc = CDLL('./ccc.so')
cc.init.restype = POINTER(c_char*12)
p = cc.init(10,20,c_float(3.1415))
print(p.contents)
print(struct.unpack('iif', p.contents))
这种方法,不需要在Python中创建继承自Structure的结构体,而是直接使用struct.unpack的方法,将结构体中的每一个分量提取出来。
Python中没有C语言中指针的概念,获取C函数返回指针,其实就是获取C函数返回的指针所指向的数据。因此,restype一定要指向一个容器类型!
以上代码运行成功,效果如下:
$ python3 test.py
<__main__.c_char_Array_12 object at 0x7fee3f7a3ec0>
(10, 20, 3.1414999961853027)
由于全部都是在一台电脑上执行这些代码,就不会存在字节序方面的问题。
-- EOF --
本文链接:https://www.pynote.net/archives/2963
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记