Question

EDIT: A la lecture du ma première question, j'ai réalisé très rapidement qu'il était très mal formulée, ambiguë et trop confus pour toujours obtenir une réponse décente. Voilà ce que je reçois pour se précipiter une question à la fin de ma pause déjeuner. Espérons que cela sera plus clair:

Je suis en train d'exposer une structure simple C à Python (3.x) en tant que PyBuffer je peux récupérer un MemoryView de celui-ci. La structure que je veux exposer est semblable à ceci:

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

et il est mon désir de permettre à l'auteur de script pour accéder aux données comme ceci:

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

Malheureusement, la documentation existante sur l'API C pour ces structures est assez rare, auto contradictoires dans les lieux, et carrément mauvais dans d'autres (signatures de fonction documentées ne correspondent pas à ceux dans les en-têtes, etc.) comme je n'ai pas une très bonne idée sur la façon de mieux exposer cela. De plus, je voudrais éviter d'inclure libs tiers pour obtenir une fonctionnalité qui devrait faire partie des libs de base, mais il me sent à comme la fonctionnalité PyBuffer est encore assez immature, et peut-être quelque chose comme NumPy serait un meilleur choix.

Quelqu'un at-il des conseils à ce sujet?

Était-ce utile?

La solution

L'ensemble de méthodes pour mettre en œuvre afin que votre type d'extension prend en charge le protocole tampon est décrit ici: http://docs.python.org/3.1/c-api/typeobj.html#buffer-object-structures

Je reconnais que la documentation est assez rude, donc le meilleur conseil que je puisse donner est de commencer par une implémentation existante de l'API tampon par un type C, par exemple bytesobject.c ou bytearrayobject.c dans le code source officiel de Python .

Cependant, s'il vous plaît noter que le protocole tampon ne donne pas accès à des notations de haut niveau comme celui que vous avez cité. img_buffer[1::4] = 255 ne fonctionnera pas sur un objet memoryview

Modifier pour être plus précis, memoryviews prennent en charge certains types d'affectation de tranche, mais pas tous. En outre, ils ne sont pas assez « intelligents » pour comprendre que l'attribution de 255 à une tranche signifie en fait que vous voulez que la valeur d'octet à répéter. Exemple:

>>> 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top