2010-03-19 6 views
2

J'ai besoin d'appeler une bibliothèque c à partir de mon code python. La bibliothèque c fait beaucoup de manipulation d'image, donc je lui passe des buffers d'image alloués en utilisant create_string_buffer.ctypes buffer modification

Le problème est que j'ai aussi besoin de manipuler et de changer ces tampons. Quel est le meilleur moyen d'atteindre et de manipuler les valeurs individuelles dans mes tampons? Les tampons sont tous des tampons uint8.

Répondre

2

Vous voulez dire, quelque chose comme ...:

>>> import ctypes 
>>> x = ctypes.create_string_buffer('howdy!') 
>>> x.value 
'howdy!' 
>>> x[0] = 'C' 
>>> x.value 
'Cowdy!' 

...?

+0

Oui, comme ça, merci. Mais comment puis-je y mettre une valeur entière (c'est-à-dire sans avoir à rechercher le symbole ascii)? Par exemple, si je veux définir un octet à 0xff, comment pourrais-je faire cela? – Chris

+0

Oh attends, je l'ai deviné: >>> x [0] = "\ x43" J'essayais ça avec "xff", mais l'impression me jetait en montrant réellement "xff". Cela a plus de sens lorsque vous l'imprimez après avoir utilisé un code pour une lettre. – Chris

+1

@Chris, si vous avez un petit entier dans une variable 'i',' chr (i) 'vous donne le caractère de 1 octet correspondant; les modules 'struct' et' array' offrent d'autres moyens de convertir divers types en chaînes d'octets. –

1

Vous pouvez trouver que Cython est beaucoup plus agréable que le module ctypes pour fusionner les bibliothèques C avec du code Python.

+0

Hmm ... ça sonne utile. Cependant, nous avons déjà beaucoup écrit en python, et je ne veux pas nécessairement m'inquiéter des incompatibilités Cython/Python. Mais je pourrais construire des modules Python-appelables avec Cython, non? Peut-être une option, et pourrait être un peu moins fou quand il s'agit d'envelopper ces fonctions. – Chris

+0

Les modules Cython peuvent être importés de Python; l'utilisation principale de Cython est de faire des modules Python qui enveloppent les bibliothèques C. En règle générale, vous utiliseriez Cython pour effectuer l'encapsulation, créer une API native et écrire la partie principale de votre code à l'aide de l'encapsuleur que vous avez écrit. –