再谈用ctypes获取C函数返回的指针

2020年12月4日 / 25次阅读 / 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

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top