41 votes

Exposer une API C ++ à Python

Je suis actuellement en train de travailler sur un projet ont été j'ai eu à envelopper les classes C++ avec Python pour être en mesure de faire un script de programme. Donc, mon expérience spécifique a également impliqué l'incorporation de l'interpréteur Python dans notre programme.

Les solutions que j'ai essayé ont été:

  • Coup de pouce.Python

    J'ai aimé le plus propre API produite par Boost.Python, mais le fait qu'il aurait fallu que les utilisateurs d'installer une autre dépendance nous a fait passer à SWIG.

  • SWIG

    SWIG principal avantage pour nous est qu'il ne nécessite pas les utilisateurs finaux de l'installer pour utiliser le programme final.

Qu'avez-vous utilisé pour ce faire, et quelle a été votre expérience avec elle?

23voto

Max Maximus Points 529

J'ai utilisé les deux (pour le même projet): Boost est mieux intégrés à la STL, et en particulier les exceptions C++. Aussi, son mécanisme de gestion de mémoire (qui tente de pont C++ gestion de la mémoire et Python GC) est beaucoup plus souple que RASADE de. Cependant, SWIG a beaucoup mieux de la documentation, sans dépendances externes, et si vous obtenez la bibliothèque enveloppé dans RASADE de Python que vous êtes plus à mi-chemin à l'obtention d'une Java/Perl/Ruby wrapper ainsi.

Je ne pense pas qu'il y a un choix évident: pour les petits projets, j'irais avec Boost.Python encore une fois, pour la plus longue durée de vie des projets, l'investissement supplémentaire dans RASADE en vaut la peine.

18voto

orip Points 28225

J'ai utilisé Robin avec beaucoup de succès.

Excellente intégration avec les types C ++ et crée un seul fichier .cpp à compiler et à inclure dans votre objet partagé.

7voto

bhadra Points 7255

Je suggère SIP. SIP est mieux que SWIG pour les raisons suivantes:

  1. Pour un ensemble donné de fichiers, gorgée génère plus de doublons (frais généraux) code de SIP. SIP gère à générer moins de dupliquer (frais généraux) code à l'aide d'un fichier de bibliothèque qui peuvent être liées statiquement ou dynamiquement. En d'autres termes, la SIP a une meilleure évolutivité.

  2. Le temps d'exécution de SIP est de beaucoup inférieure à celle de SWIG. Reportez-Vous Wrapper Python Outils: Une Étude De Performance. Malheureusement le lien semble rompu. J'ai une copie personnelle qui peut être partagé sur demande.

5voto

Toni Ruža Points 5538

le pyrex ou le cython sont également des moyens simples et efficaces de mélanger les deux mondes.

Empaqueter C ++ en utilisant ces outils est un peu plus compliqué qu'empaqueter C, mais cela peut être fait. Voici la page wiki à ce sujet.

2voto

wr. Points 1887

Un gros avantage de Boost :: Python est qu’il permet de compléter les onglets dans le shell ipython: vous importez une classe C ++ exposée directement par Boost ou vous la sous-classez et, à partir de ce moment, elle se comporte vraiment comme une pure classe Python.

L'inconvénient: Il faut si longtemps pour installer et utiliser Boost que toutes les économies de temps liées à la réalisation des onglets ne seront jamais amorties ;-(

Donc, je préfère Swig: pas de cloches et de sifflets, mais fonctionne de manière fiable après un bref exemple d'introduction.

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