2012-12-12 109 views
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作品,但需要先複製緩衝區。我正在尋找解決緩衝區可寫的要求的方法,因爲沒有人會寫在那裏,我想避免冗餘的數據複製。

+0

你能舉一些例子代碼嗎? – ebarr

+1

我們走了,我希望現在很清楚 – Kos

+0

所以這可能是有用的http://stackoverflow.com/questions/121396/accessing-object-memory-address。我嘗試瞭解其中的建議,但成效有限。這個技巧最有可能是編寫一個PythonC_API函數來獲取緩衝區並返回它的地址。這應該相對容易。 – ebarr

回答

0

你可以施放一個Python字符串char*與ctypes的,這點實際內存有Python字符串數據存儲。

隨意雙重播放。