Pregunta

EDIT: Al volver a leer mi pregunta original me di cuenta muy rápidamente de que estaba muy mal redactado, ambigua, y demasiado confuso para siempre obtener una respuesta decente. Eso es lo que me pasa por salir corriendo una pregunta al final de mi hora de almuerzo. Espero que esto será más claro:

Estoy tratando de exponer una estructura simple C para Python (3.x) como un PyBuffer para que pueda recuperar una MemoryView de ella. La estructura Quiero exponer es similar a esto:

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

y es mi deseo de permitir que el guionista para acceder a los datos de este modo:

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

Por desgracia, la documentación existente acerca de la API C para estas estructuras es bastante escaso, auto contradictoria en algunos lugares, y francamente mal en los demás (firmas de función documentadas no coinciden con los de las cabeceras, etc.), como tal, no tengo una muy buena idea acerca de cómo exponer mejor esto. Además, me gustaría evitar la inclusión de librerías de terceros para lograr la funcionalidad que debe ser parte de las bibliotecas centrales, pero se siente a mí como la funcionalidad PyBuffer es aún bastante inmaduro, y tal vez algo así como NumPy sería una mejor opción.

¿Alguien tiene algún consejo sobre esto?

¿Fue útil?

Solución

El conjunto de métodos para poner en práctica de manera que su tipo de extensión es compatible con el protocolo de tampón se describe aquí: http://docs.python.org/3.1/c-api/typeobj.html#buffer-object-structures

Reconozco que la documentación es bastante duro, por lo que el mejor consejo que puedo dar es que partir de una implementación existente de la API de memoria intermedia por un tipo C, por ejemplo bytesobject.c o bytearrayobject.c en el código fuente de Python oficial .

Sin embargo, tenga en cuenta que el protocolo de memoria intermedia no da acceso a las anotaciones de alto nivel como el que usted ha citado:. img_buffer[1::4] = 255 no funcionará en un objeto memoryview

Editar para ser más precisos, memoryviews apoyan algunos tipos de misiones rebanada, pero no todos ellos. Además, no son "inteligentes" como para entender que la asignación de 255 a una rebanada en realidad significa que desea que el valor de byte a repetirse. Ejemplo:

>>> 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top