書き込み可能な がある場合buffer
、 function を使用ctypes.c_void_p.from_buffer
して、このバッファーへの C ポインターを取得できます。
ただし、書き込み不可のバッファを処理するにはどうすればよいでしょうか。書き込み不可のバッファの書き込み可能なコピーを作成せずにconst
a を期待する C コードに渡すことができるポインタを作成するにはどうすればよいですか?const void*
私は考え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)
メソッド with はfrom_buffer_copy
機能しますが、最初にバッファをコピーする必要があります。誰もそこに書き込むつもりはなく、データの冗長なコピーを避けたいので、書き込み可能なバッファの要件を回避する方法を探しています。