You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:48:17