Je veux appeler une bibliothèque C à partir d'une application Python. Je ne veux pas envelopper toute l'API, seulement les fonctions et les types de données qui sont pertinents pour mon cas. À mon avis, j'ai trois possibilités :
- Créer un module d'extension en C. C'est probablement exagéré, et j'aimerais aussi éviter d'avoir à apprendre à écrire des extensions.
- Utilice Cython pour exposer les parties pertinentes de la bibliothèque C à Python.
- Faites le tout en Python, en utilisant
ctypes
pour communiquer avec la bibliothèque externe.
Je ne suis pas sûr que 2) ou 3) soit le meilleur choix. L'avantage de 3) est que ctypes
fait partie de la bibliothèque standard, et le code résultant serait purement Python - bien que je ne sois pas sûr de l'importance de cet avantage.
Y a-t-il plus d'avantages/inconvénients avec l'un ou l'autre des choix ? Quelle approche recommandez-vous ?
Editar: Merci pour toutes vos réponses, elles constituent une bonne ressource pour quiconque cherche à faire quelque chose de similaire. La décision, bien sûr, doit encore être prise pour chaque cas - il n'y a pas de réponse unique du type "C'est la bonne chose à faire". Dans mon cas, j'opterai probablement pour ctypes, mais j'ai également hâte d'essayer Cython dans le cadre d'un autre projet.
Comme il n'y a pas une seule vraie réponse, en choisir une est quelque peu arbitraire ; j'ai choisi la réponse de FogleBird car elle donne un bon aperçu de ctypes et c'est actuellement la réponse la plus votée. Cependant, je suggère de lire toutes les réponses pour avoir une bonne vue d'ensemble.
Merci encore.
4 votes
Dans une certaine mesure, l'application spécifique concernée (ce que fait la bibliothèque) peut affecter le choix de l'approche. Nous avons utilisé ctypes avec beaucoup de succès pour parler à des DLL fournies par des fournisseurs pour diverses pièces de matériel (par exemple des oscilloscopes), mais je ne choisirais pas nécessairement ctypes en premier pour parler à une bibliothèque de traitement numérique, en raison de la surcharge par rapport à Cython ou SWIG.
1 votes
Maintenant vous avez ce que vous cherchiez. Quatre réponses différentes. (quelqu'un a aussi trouvé SWIG). Cela signifie que maintenant vous avez 4 choix au lieu de 3.
0 votes
@ralu C'est ce que je pensais aussi :-) Mais sérieusement, je ne m'attendais pas (ou ne voulais pas) d'un tableau pro/con ou d'une réponse unique disant "Voici ce que vous devez faire". Toute question sur la prise de décision est mieux répondue par des "fans" de chaque choix possible donnant leurs raisons. Le vote de la communauté fait alors sa part, tout comme mon propre travail (examiner les arguments, les appliquer à mon cas, lire les sources fournies, etc.) En bref, il y a de bonnes réponses ici.
0 votes
Alors, quelle approche allez-vous adopter ? :)
0 votes
Je réfléchis encore, mais je penche fortement pour les ctypes.
1 votes
Pour autant que je sache (corrigez-moi si je me trompe), Cython est un fork de Pyrex avec plus de développement, ce qui rend Pyrex pratiquement obsolète.
0 votes
@balpha Peut-être que vous pouvez refléter dans votre question, qu'il y a CFFI maintenant (qui est supérieur à ctypes à bien des égards).