El python documentation on array indica claramente que la matriz se ajusta a la interfaz del búfer. Incluso sugiere no utilizar el método buffer_info(). Pero cuando trato de obtener un Py_Buffer del código C/C++ con PyObject_GetBuffer() o uso la memoria de Python, obtengo un error.¿Por qué no es posible obtener un Py_buffer de un objeto de matriz?
Por ejemplo, en python (yo uso la versión 2.7):
>>> a = array.array('c')
>>> memoryview(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot make memory view because object does not have the buffer interface
De hecho, cuando busco código base del pitón, solamente bytearrayobject (bytearray), memoryobject (memoryview), y stringobject (str) tienen el indicador Py_TPFLAGS_HAVE_NEWBUFFER requerido establecido en ellos. Según entiendo, la documentación es incorrecta; array no es compatible con la interfaz del búfer.
Podría usar bytearray, que es compatible con la interfaz del búfer, el problema es que necesito el práctico método fromfile() de la matriz para leer en un búfer que pueda usar en mi código C/C++.
¿Hay alguna alternativa que me permita leer un archivo en un búfer y usar este búfer desde el código C, y no involucrar copias de memoria? (Quiero tratar grandes archivos binarios y copiar es una opción menos deseable).
De acuerdo, como dije en mi pregunta. Pero ... bytearray no tiene el práctico método de archivo. Supongo que puedo usar un objeto de cadena para representar mis datos binarios, pero saber que un buffer (como bytearray) puede llenarse desde el archivo expande mis opciones. También está el caso de esquina unicode de una cadena que se eliminaría si pudiera usar otro tipo de buffer. – David
El informe de error está aquí: http://bugs.python.org/issue17145 – mpb