[Python-Dev] ctypes, memory mapped files and context manager

Armin Rigo armin.rigo at gmail.com
Sun Jan 8 03:25:13 EST 2017


Hi Hans-Peter,

On 6 January 2017 at 00:28, Hans-Peter Jansen <hpj at urpla.net> wrote:
> Leaves the question, how stable this "interface" is?

Another way to jump through hoops:

    c_raw = ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p)(lambda p: p)

    addr = c_raw(ctypes.pointer(T.from_buffer(m)))
    b = ctypes.cast(addr, ctypes.POINTER(T)).contents

These lines give an object 'b' that is equivalent to
'T.from_buffer(m)', but doesn't hold any reference or any "opened
buffer" state to the original 'm'.  Your context manager can yield
that.  It should prevent all BufferErrors, at the price of segfaulting
if used incorrectly.  This means in your case that ``with
map_struct(..) as a:`` should not continue to use ``a`` after the
``with`` statement, which is pretty natural anyway.

(The same issue occurs with cffi instead of ctypes, but in this case a
simple cast is enough to detach the memoryview, instead of the hack
above.)


A bientôt,

Armin.


More information about the Python-Dev mailing list