6
如果我有一個可寫buffer
,我可以使用ctypes.c_void_p.from_buffer
函數來獲得C指針到該緩衝液。常量無效*指針中的ctypes
但是,如何處理不可寫緩衝區呢?如何形成一個const
指針,我可以將它傳遞給需要const void*
的C代碼,而不需要製作非可寫緩衝區的可寫副本?
我認爲c_void_p.from_address
但緩衝器(和memoryviews)似乎並沒有暴露自己的地址。
一些澄清:
>>> 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
作品,但需要先複製緩衝區。我正在尋找解決緩衝區可寫的要求的方法,因爲沒有人會寫在那裏,我想避免冗餘的數據複製。
你能舉一些例子代碼嗎? – ebarr
我們走了,我希望現在很清楚 – Kos
所以這可能是有用的http://stackoverflow.com/questions/121396/accessing-object-memory-address。我嘗試瞭解其中的建議,但成效有限。這個技巧最有可能是編寫一個PythonC_API函數來獲取緩衝區並返回它的地址。這應該相對容易。 – ebarr