const void *指向ctypes

时间:2012-12-12 17:47:10

标签: python python-2.7 buffer const ctypes

如果我有一个可写的buffer,我可以使用ctypes.c_void_p.from_buffer函数来获得一个指向这个缓冲区的C指针。

但是,如何处理不可写缓冲区?如何形成一个const指针,我可以传递给期望const void*的C代码,而无需使用不可写缓冲区的可写副本?

我考虑过c_void_p.from_address,但缓冲区(和内存视图)似乎没有公开他们的地址。


一些澄清:

>>> import ctypes
>>> b = buffer("some data that supports the buffer interface, like a str")
>>> ptr = ctypes.c_void_p.from_buffer(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: buffer is read-only
>>> ptr = ctypes.c_void_p.from_buffer_copy(b)    # works, but has to copy data
>>> ptr = ctypes.CONST(c_void_p).from_buffer(b)  # (I'm making this one up)
>>> ptr = ctypes.c_void_p.from_address(???)      # could work; how to get addr?

这适用于void some_api(const void* read_only_data),如:

>>> ctypes.cdll.LoadLibrary(some_lib).some_api(ptr)

from_buffer_copy的方法有效,但需要先复制缓冲区。我正在寻找解决缓冲区可写性要求的方法,因为没有人会在那里写,我想避免冗余的数据复制。

1 个答案:

答案 0 :(得分:0)

您可以使用ctypes将Python字符串强制转换为char*,并指向存储Python字符串数据的实际内存。

随意双重播放。