45 votes

Comparaison de la bibliothèque de liaison Python/C++

J'ai l'impression que cette question fait double emploi, mais je n'en ai pas encore trouvé une sur le sujet (spécifiquement), alors je la pose quand même :

Quelles bibliothèques de liaison Python/C++ recommanderiez-vous et pourquoi ? En outre, quelle a été votre expérience en l'utilisant ou en utilisant toute autre bibliothèque que vous avez essayée ? De plus, quelles fonctions de liaison contiennent-elles et l'utilisation que vous en faites est-elle personnelle ou professionnelle ?

Pour commencer, en voici quelques-unes que j'ai essayées récemment (pour un usage personnel) :

SWIG

  • Prise en charge de Python 2 et 3
  • Peut être ultra-automatique dans les bonnes circonstances.
  • Lorsqu'il n'est pas ultra-automatique, il consiste principalement à répéter vos fichiers .h et à fournir des indications.
  • Prise en charge de nombreux autres langages que Python (Java, Ruby, Lua, etc.)
  • La sortie consiste en un fichier natif (à compiler dans un .pyd) et un "wrapper" python.
  • Les fixations semblent être raisonnablement maigres.
  • Ne semble pas supporter les propriétés (valeurs accessibles par getter/setters)
  • Très bien documenté, instructions d'installation faciles à suivre.
  • Utilisé par Google (hé, ça doit compter pour QUELQUE CHOSE, non ?)

Boost::Python

  • Support de Python 2 et 3
  • La syntaxe peut s'avérer gênante pour les nouveaux venus, mais elle est simple et peu encombrante.
  • Utilisation intensive des templates C++ (peut être une bonne ou une mauvaise chose)
  • Distribué en tant que partie de la bibliothèque Boost, qui est énorme. (Utile, mais énorme)
  • La compilation initiale de la bibliothèque peut être un exercice de frustration.
  • Peut augmenter considérablement les temps de compilation
  • Quelques bizarreries, comme la spécification des politiques de valeur de retour pour les fonctions qui renvoient des types natifs.
  • Bibliothèque très solide, stable et bien testée
  • Prend en charge les propriétés
  • La documentation est moyenne. Des tutoriels d'introduction décents, mais l'utilisation plus avancée est quelque peu négligée. La documentation est également fragmentée : Il existe au moins trois tutoriels différents sur la façon de construire la bibliothèque, tous très différents les uns des autres.
  • Les fixations ont la réputation d'être quelque peu gonflées.

J'utilise actuellement Boost::Python, principalement parce que j'ai vraiment besoin du support des propriétés, mais je suis très curieux de voir ce que les gens pensent de certaines autres bibliothèques !

13voto

Christopher Bruns Points 3114

J'utilise boost python, avec pyplusplus.

Boost::Python

  • outil d'emballage mature, durci au combat et largement utilisé
  • supporte Python 3 depuis la version boost 1.43
  • Utilisez Py++ Module python, basé sur gccxml, pour automatiser l'habillage des grands projets. Obtenez la dernière version depuis le dépôt de subversion.
  • enveloppe les classes internes
  • la mise en correspondance complète de fonctionnalités C++ complexes avec les fonctionnalités python correspondantes : conteneurs STL, exceptions, classes internes, propriétés
  • ne prend pas en charge les langages autres que python
  • La compilation des wrappers peut prendre beaucoup de temps.
  • la taille importante du module pourrait poser problème pour les plateformes mobiles/embarquées
  • http://www.boost.org/doc/libs/1_47_0/libs/python/doc/

Swig

  • outil d'emballage mature, durci au combat et largement utilisé
  • peut créer des wrappers pour d'autres langages que python, notamment Ruby et Java
  • ne prend pas en charge l'habillage des classes internes. C'était le facteur déterminant pour moi, lorsque je devais envelopper des API C++ complexes.

Manuel ; API C de python

  • faire théoriquement tout ce que les autres méthodes d'enveloppement peuvent faire
  • un bon candidat si vous ne voulez envelopper que quelques objets/méthodes.

ctypes

  • tout votre travail d'emballage peut/doit être effectué en python

Cython

SIP

  • créé pour le projet PyQt4

Shiboken

  • créé pour le projet PySide, qui émule PyQt4
  • pourrait être optimisé pour les plateformes mobiles ?

Robin

PyCXX

7voto

JPVDB Points 71

Je me pencherais également sur les solutions plus automatisées (généralement basées sur gccxml). Py++ est un bon point de départ, il crée des liaisons boost::python à partir des sources de la bibliothèque et d'une description de l'interface.

6voto

aslosci Points 1

Voici une bonne comparaison des éléments suivants C Api, SWIG, SIP, Boost, Weave, Pyrex : http://www.suttoncourtenay.org.uk/duncan/accu/integratingpython.html

Mise à jour : vous pouvez trouver l'article dans la machine wayback http://web.archive.org/web/20090604182721/http://www.suttoncourtenay.org.uk/duncan/accu/integratingpython.html

5voto

luc Points 13564

Vous pouvez jeter un coup d'œil à pyCxx qui est à mon avis une très belle bibliothèque. Je ne peux pas faire une vraie comparaison avec Boost::Python ou SWIG mais je pense qu'elle est moins lourde que Boost et plus facile à utiliser que SWIG.

Je l'ai utilisé dans le passé et j'ai été très satisfait de ce choix. Il était facile de faire une extension python. En particulier, j'ai apprécié les exemples fournis. Il était facile de démarrer par rapport à Boost et SWIG que j'ai essayé auparavant.

La page du projet indique que Python 2 et 3 sont supportés. Je ne l'ai utilisé qu'avec Python 2.

Je serais intéressé de lire votre évaluation de pycxx. Celles que vous avez faites pour Boost et SWIG sont très intéressantes.

3voto

J'aime beaucoup SWIG pour Python. Les meilleures diapositives :

http://www.dabeaz.com/SwigMaster/index.html

Si vous y arrivez, vous aurez une bonne idée de SWIG. Il y a une petite coquille sur la diapositive I-12 (je crois). Mais oui, Beazley est un génie (et il explique très clairement cette partie et d'autres parties de Python).

Récemment, j'ai modifié pyglfw (qui utilise SWIG) pour créer une nouvelle méthode glfwPlatformGetWindowPos. C'était assez simple après avoir lu ces diapositives et avoir appris à maîtriser SWIG.

Mais ce qui est bien avec SWIG, c'est qu'il embrasse vraiment l'idée d'un arbre d'analyse. Cela permet toutes sortes de fonctionnalités intéressantes (similaires aux macros lisp) qui améliorent vraiment l'ensemble du processus (par exemple, la génération de "décorateurs" tout au long de l'arbre, ce qui est sans doute une grande partie de l'interface entre les deux langages). SWIG est assez élégant, si vous voulez mon avis.

Je n'ai pas encore utilisé Boost.Python, mais j'ai beaucoup utilisé Boost. Et ils ont beaucoup de bonnes bibliothèques C++. Mais il y a un peu de tendance à gonfler via la métaprogrammation de modèles (comme le mentionne le PO). C'est comme ACE ciblant des plateformes multiples. Ou Javascript ciblant de multiples navigateurs. Au bout d'un moment, la chose se déconcentre (dans leur cas, en ciblant plusieurs compilateurs). Boost.Python est peut-être une exception. Mais si vous y réfléchissez, SWIG a été "testé en profondeur" avec plusieurs langages. Si votre code C++ existe déjà et qu'il contient beaucoup de templates... peut-être que Boost vaut la peine d'être considéré (c'est ainsi que je le vois en tout cas).

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