Domanda

Il Documentazione di Python sull'array afferma chiaramente che il Vettore è conforme all'interfaccia buffer. Suggerisce persino di non usare il metodo buffer_info (). Ma quando provo a ottenere un PY_BUFFER dal codice C/C ++ con pyObject_getBuffer () o uso MemoryView di Python, ricevo un errore.

Ad esempio, in Python (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 effetti, quando cerco la base di codice di Python, solo ByteArrayObject (ByteArray), MemoryObject (MemoryView) e StryObject (STR) hanno il flag Py_Tpflags_Have_NewBuffer richiesto impostato su di essi. Per mia comprensione, la documentazione è sbagliata; Vettore non supporta l'interfaccia buffer.

Potrei usare ByteArray che supporta l'interfaccia buffer, il problema è che ho bisogno del metodo pratico dell'array da File () per leggere in un buffer che posso utilizzare nel mio codice C/C ++.

Esiste un'alternativa che mi consentirebbe di leggere un file in un buffer e utilizzare questo buffer dal codice C e non coinvolgere copie di memoria? (Voglio trattare i grandi file binari e la copia è un'opzione meno desiderabile).

È stato utile?

Soluzione

memoryview Funziona solo su oggetti che supportano l'interfaccia buffer Python 3. array.array In Python 3 lo fa, ma non è in Python 2.7. Potresti voler presentare un report di bug per questo. Basta usare l'uso bytearray (o str Se lo stai usando solo lettura). Entrambi supportano memoryview va bene.

Altri suggerimenti

Python 2.6+ ha due diverse interfacce buffer, proprio come ha due diversi tipi di classi: la versione classica e la versione Python 3.

Dal Manuale di riferimento API Python/C:

Due esempi di oggetti che supportano l'interfaccia buffer sono stringhe e array. L'oggetto stringa espone il contenuto del carattere nella forma orientata all'interfaccia buffer. Un array può esporre solo il suo contenuto tramite l'interfaccia buffer in stile vecchio. Questa limitazione non si applica a Python 3, in cui gli oggetti MemoryView possono essere costruiti anche da array.

Nel codice Python 2.7, puoi lavorare con i buffer di vecchio stile usando il buffer funzione e buffer di nuovo stile usando memoryview. Python 3 supporta solo quest'ultimo.

Una distinzione simile esiste nell'API Python 2 C; PyObject_GetBuffer è per la nuova interfaccia buffer, PyBuffer_FromObject/PyBuffer_FromReadWriteObject è per la vecchia interfaccia buffer (e dovrebbe funzionare per gli array). Vedi il link sopra per ulteriori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top