Hi Hans-Peter, On 6 January 2017 at 00:28, Hans-Peter Jansen <h...@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. _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com