如何将Python对象转换为ctypes.c_void_p以调用C API?
如何将Python对象转换为C void指针(ctypes实现)
我之前也踩过这个坑——pointer()和byref()确实搞不定普通Python对象,它们是专门用来操作ctypes原生数据类型(比如c_int、c_char_p)的指针工具。要把任意Python对象转成C的void*,得用py_object配合cast函数来实现,具体步骤如下:
步骤1:导入ctypes并准备Python对象
先导入ctypes模块,然后定义你要转换的Python对象(可以是列表、字典、自定义类实例等任意Python对象):
from ctypes import * # 示例Python对象,这里用自定义类实例举例 class MyPythonClass: def __init__(self, name): self.name = name my_python_obj = MyPythonClass("TestObject")
步骤2:封装并转换为void*指针
py_object是ctypes专门用来包裹Python原生对象的类型,我们先把普通Python对象包装成这个类型,再通过cast函数转换成c_void_p(对应C语言的void*):
# 将Python对象封装为ctypes可识别的py_object类型 wrapped_obj = py_object(my_python_obj) # 转换为C的void*指针 void_ptr = cast(wrapped_obj, c_void_p)
现在void_ptr.value就是该Python对象在内存中的地址,你可以直接把它传给需要void*参数的C API函数了。
步骤3:(可选)从void*转回Python对象
如果之后需要把C端的void*恢复成Python对象,同样用cast函数转成py_object,再取.value属性即可:
# 从void*恢复原Python对象 recovered_obj = cast(void_ptr, py_object).value print(recovered_obj.name) # 输出: TestObject
关键注意事项
- 防止对象被垃圾回收:务必保证原Python对象或
wrapped_obj在C API调用期间始终存在。如果Python对象被GC回收,对应的void*会变成野指针,引发程序崩溃或不可预知的行为。 - 不要直接修改指针内存:C的
void*只是内存地址,直接通过C代码修改这块内存会破坏Python对象的内部结构,导致严重错误。
内容的提问来源于stack exchange,提问作者John Liu
相关产品推荐
相关产品推荐

