6 votes

Création d'un wrapper pour une bibliothèque C en Python

Je suis en train de créer ma propre interface pour FLAC, afin de pouvoir utiliser FLAC dans mon propre code Python.

J'ai d'abord essayé d'utiliser ctypes, mais cela a donné une interface vraiment étrange à la bibliothèque, par exemple, toutes les fonctions d'initialisation pour les flux et les fichiers FLAC sont devenues une seule fonction sans réelle information sur la façon de l'initialiser. Surtout parce qu'il veut une référence à un décodeur de flux, mais Python n'a pas de moyen de stocker des pointeurs (BZZZT!), et donc je ne peux pas stocker le pointeur du décodeur de flux. Le fait que les différentes fonctions d'initialisation aient un nombre d'arguments différents et que certains types d'arguments diffèrent n'aide pas non plus. Il y a aussi beaucoup d'énumérations et de structures, et je ne sais pas comment les intégrer dans mon code.

J'ai jeté un œil à Pyrex, mais j'ai un peu rencontré le même problème avec les pointeurs, mais je pense avoir trouvé une solution, en quelque sorte. Le fichier n'est pas petit non plus, et il n'est même pas complet.

Je cherche donc des alternatives, ou des guides qui m'aideraient à mieux comprendre les moyens mentionnés précédemment. Il serait vraiment utile si je pouvais obtenir une recommandation et/ou de l'aide.

11voto

mtasic85 Points 1223

Python n'a pas de moyen de stocker des pointeurs, et donc je ne peux pas stocker le pointeur du décodeur de flux

ctypes a des pointeurs, et ctypes peut être utilisé pour envelopper des bibliothèques C existantes. Juste un conseil, vous devrez envelopper/réécrire toutes les structures C pertinentes en ctypes.Structure. Jetez un œil aux exemples : code.google.com/p/pyxlib-ctypes et code.google.com/p/pycairo-ctypes. Plus d'infos sur la façon de mapper une fonction/procédure et ses argtypes et restype sur http://docs.python.org/library/ctypes.html

J'ai regardé du côté de Pyrex, mais je suis un peu tombé sur le même problème avec les pointeurs, mais je pense l'avoir résolu, en quelque sorte. Le fichier n'est pas petit non plus, et ce n'est même pas complet.

cython peut être ce dont vous avez besoin si vous voulez une syntaxe propre. www.cython.org

Donc je suis à la recherche d'alternatives, ou de guides qui m'aideraient à mieux comprendre les moyens mentionnés ci-dessus. Ce serait vraiment utile si je pouvais obtenir une recommandation et/ou de l'aide.

swig d'autre part peut toujours être utilisé mais c'est plus compliqué si vous n'y êtes pas habitué. www.swig.org

5voto

Pierre Points 15256

Avez-vous jeté un coup d'œil à http://www.swig.org/:

SWIG est un outil de développement logiciel qui connecte des programmes écrits en C et C++ avec une variété de langages de programmation de haut niveau.

4voto

Unknown Points 22789

mais Python n'a pas de moyen de stocker des pointeurs (BZZZT!)

C'est incorrect. Vous créez un pointeur comme ceci :

pInt = POINTER(c_int)()

et vous y accédez comme ceci

pInt[0] # ou p.contents

3voto

kirbyfan64sos Points 1656

Cet article est ancien, mais il existe une alternative à ctypes : CFFI. C'est beaucoup plus facile, un peu plus rapide et fonctionne mieux sous PyPy. De plus, il offre un excellent support pour les pointeurs. Voici un exemple :

from cffi import FFI

ffi = cffi.FFI()

ffi.cdef('''
struct x { void *a; }

void* get_buffer();
struct x* make_x(void*);
void change_x(struct x*, void*);
''')

dll = ffi.dlopen('libmyawesomelibrary.so')

buf = dll.get_buffer()
tst = dll.new('struct x*')
tst.a = buf
change_x(tst, get_buffer())
tst2 = make_x(get_buffer())

0voto

S.Lott Points 207588

Certains utilisent pyrex pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X