Domanda

EDIT: Su rileggendo la mia domanda iniziale mi sono reso conto molto presto che era molto mal formulata, ambiguo, e troppo confuso per mai ottenere una risposta decente. Questo è ciò che ho per correre una domanda alla fine della mia pausa pranzo. Speriamo che questo sarà più chiaro:

Sto cercando di esporre una semplice struttura di C per Python (3.x) come PyBuffer in modo da poter recuperare una MemoryView da esso. La struttura che voglio esporre è simile a questo:

struct ImageBuffer {
    void* bytes;
    int row_count;
    int bytes_per_row;
};

ed è mio desiderio di permettere allo scrittore script per accedere ai dati in questo modo:

img_buffer = img.get_buffer()
img_buffer[1::4] = 255 # Set every Red component to full intensity

Purtroppo la documentazione esistente sulle API C per queste strutture è piuttosto scarsa, sé contraddittorio in alcuni punti, e addirittura sbagliato in altri (le firme di funzione documentati non corrispondono a quelle nelle intestazioni, ecc) in quanto tale non ho una buona idea su come esporre al meglio questo. Inoltre, vorrei evitare di includere librerie di terze parti per ottenere la funzionalità che dovrebbe essere parte delle librerie di base, ma ci si sente a me come la funzionalità PyBuffer è ancora abbastanza immaturo, e forse qualcosa di simile NumPy sarebbe una scelta migliore.

Qualcuno ha qualche consiglio su questo?

È stato utile?

Soluzione

L'insieme di metodi per implementare in modo che il tipo di estensione supporta il protocollo di buffer è descritto qui: http://docs.python.org/3.1/c-api/typeobj.html#buffer-object-structures

Mi rendo conto che la documentazione è piuttosto difficili, quindi il miglior consiglio che posso dare è quello di iniziare da un'implementazione esistente delle API di buffer da un tipo C, per esempio bytesobject.c o bytearrayobject.c nel codice sorgente Python ufficiale .

Tuttavia, si ricorda che il protocollo di buffer non dà accesso alle notazioni di alto livello come quello che hai citato:. img_buffer[1::4] = 255 non funzionerà su un oggetto memoryview

Modifica per essere più precisi, memoryviews sostengono alcuni tipi di assegnamento di una fetta, ma non tutti. Inoltre, essi non sono "intelligenti" abbastanza per capire che l'assegnazione di 255 a una fetta significa in realtà che si desidera che il valore di byte da ripetere. Esempio:

>>> b = bytearray(b"abcd")
>>> m = memoryview(b)
>>> m[0:2] = b"xy"
>>> b
bytearray(b'xycd')
>>> m[0:2] = 255
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' does not support the buffer interface
>>> m[0:2] = b"x"
Traceback (most recent call last):
  File "", line 1, in 
ValueError: cannot modify size of memoryview object
>>> m[0::2] = b"xy"
Traceback (most recent call last):
  File "", line 1, in 
NotImplementedError
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top