Il python documentation on array indica chiaramente che l'array è conforme all'interfaccia del buffer. Suggerisce anche di non usare il metodo buffer_info(). Ma quando cerco di ottenere un Py_Buffer dal codice C/C++ con PyObject_GetBuffer() o di usare python's memoryview, ottengo un errore.Perché non è possibile ottenere un Py_buffer da un oggetto array?
Per esempio, in python (io uso la versione 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
In realtà, quando cerco base di codice di Python, solo bytearrayobject (ByteArray), memoryobject (memoryview), e stringobject (str) hanno il flag Py_TPFLAGS_HAVE_NEWBUFFER richiesto su di essi. Per quanto ne so, la documentazione è sbagliata; L'array non supporta l'interfaccia del buffer.
Potrei usare bytearray che supporta l'interfaccia buffer, il problema è che ho bisogno del pratico metodo fromfile() dell'array per leggere in un buffer che posso usare nel mio codice C/C++.
Esiste un'alternativa che consenta di leggere un file in un buffer e utilizzare questo buffer dal codice C e non coinvolgere le copie di memoria? (Voglio trattare grandi file binari e copiare è un'opzione meno desiderabile).
D'accordo, come ho detto nella mia domanda. Ma ... bytearray non ha il pratico metodo fromfile. Immagino di poter usare un oggetto stringa per rappresentare i miei dati binari, ma sapere che un buffer (come bytearray) può essere riempito da file espande le mie opzioni. C'è anche il caso dell'angolo unicode di una stringa che verrebbe eliminato se potessi usare un altro tipo di buffer. – David
Il bug report è qui: http://bugs.python.org/issue17145 – mpb