Intégrer Python Et C++

j'apprends le C++ parce que c'est un langage très flexible. Mais pour les choses internet comme Twitter, Facebook, Delicious et d'autres, Python semble une bien meilleure solution.

est-il possible d'intégrer C++ et Python dans le même projet?

45
demandé sur John Isaiah Carmona 2009-07-20 17:28:04

11 réponses

interfacer Python avec C/C++ n'est pas une tâche facile.

ici je copie/colle une réponse précédente sur une question précédente pour les différentes méthodes pour écrire une extension python. Mettant En Vedette Coup De Pouce.Python, SWIG, Pybindgen...

  • vous pouvez écrire une extension vous-même en C ou C++ avec le Python C-API .

    en un mot: ne faites pas cela sauf pour apprendre comment le faire. Il est très difficile de le faire correctement. Vous devrez incrémenter et décrémenter les références à la main et écrire beaucoup de code juste pour exposer une fonction, avec très peu d'avantages.

  • Rasade :

    pro: vous pouvez générer des reliures pour de nombreux langages de script.

    inconvénients: je n'aime pas la façon dont l'analyseur fonctionne. Je ne sais pas s'ils ont fait des progrès, mais il y a deux ans l'analyseur C++ était assez limité. La plupart du temps, j'ai dû copier/coller mon .h en-têtes pour ajouter quelques caractères % et pour donner des conseils supplémentaires à l'analyseur de swig.

    j'avais aussi besoin de traiter l'API C-Python de temps en temps pour (pas si) des conversions de type compliquées.

    Je ne l'utilise plus.

  • coup de pouce.Python :

    pro: C'est un très bibliothèque complète. Il vous permet de faire presque tout ce qui est possible avec L'API C, mais en C++. Je n'ai jamais eu à écrire un code C-API avec cette bibliothèque. Je n'ai jamais rencontré de bogue à cause de la bibliothèque. Le Code pour les reliures fonctionne comme un charme ou refuse de compiler.

    c'est probablement l'une des meilleures solutions actuellement disponibles si vous avez déjà une bibliothèque C++ à lier. Mais si vous n'avez qu'une petite fonction C à réécrire, J'essaierai probablement avec Cython.

    inconvénients: si vous n'avez pas de Boost précompilé.Python library vous allez utiliser Bjam (sorte de remplacement de make). Je déteste vraiment Bjam et sa syntaxe.

    les bibliothèques Python créées avec B. P ont tendance à devenir obèses. Il faut aussi un lot de temps pour les compiler.

  • Py++ : coup de pouce.Python rendu facile. Py++ utilise un analyseur C++ pour lire votre code et puis génère coup de pouce.Code Python automatiquement. Vous disposez également d'un grand soutien de son auteur (non, ce n'est pas moi ;-) ).

    contre: seuls les problèmes dus à Boost.Python lui-même.

    Modifier ce projet semble abandonné. Tout en travaillant probablement encore, il peut être préférable d'envisager la commutation.

  • Pybindgen :

    génère le code traiter avec le C-API. Vous pouvez soit décrire des fonctions et des classes dans un fichier Python, soit laisser Pybindgen lire vos en-têtes et générer des liaisons automatiquement (pour cela, il utilise pygccxml, une bibliothèque python écrite par L'auteur de Py++).

    contre: c'est un projet jeune, avec une équipe plus petite que Boost.Python. Il y a encore quelques limites: vous ne pouvez pas exposer vos propres exceptions C++, vous ne pouvez pas utiliser l'héritage multiple pour vos classes c++.

    il vaut la peine d'essayer!

  • Pyrex et Cython :

    ici, vous n'écrivez pas de vrai C / C++ mais un mélange entre Python et C. Ce code intermédiaire générera un module Python régulier.

Edit Jul 22 2013: maintenant Py++ semble abandonné, je suis maintenant à la recherche d'une bonne alternative. Je suis en train d'expérimenter avec Cython pour mon C++ bibliothèque. Ce langage est un mélange entre Python et C. Dans une fonction Cython, vous pouvez utiliser soit des entités Python, soit des entités C/C++ (fonctions, variables, objets, etc.)...).

Cython est assez facile à apprendre, a de très bonnes performances, et vous pouvez même éviter complètement C/C++ si vous n'avez pas à interfacer les bibliothèques C++ héritées.

Cependant pour C++ il vient avec quelques problèmes. Il est moins "automagique" que Py++ ne l'était, donc c'est probablement mieux pour L'API stable C++ (qui est maintenant le cas de ma bibliothèque). Le plus gros problème que je vois avec Cython est le polymorphisme C++. Avec Py++ / boost: python, j'ai pu définir une méthode virtuelle en C++, la modifier en Python, et avoir la version Python appelée en C++. Avec Cython, C'est toujours faisable, mais vous devez utiliser explicitement L'API C-Python.

Modifier 2017-10-06:

il y en a un nouveau, pybind11 , similaire à Stimuler.Python, mais avec quelques avantages potentiels. Par exemple, il utilise les fonctionnalités du langage C++11 pour simplifier la création de nouvelles liaisons. De plus, il s'agit d'une bibliothèque en-tête seulement, donc il n'y a rien à compiler avant de l'utiliser, et aucune bibliothèque à relier.

j'ai joué avec un peu et il était en effet assez simple et agréable à utiliser. Ma seule peur, C'est comme Boot.Python il pourrait conduire à un long temps de compilation et de grandes bibliothèques. Je n'ai pas fait de test encore.

76
répondu ascobol 2017-10-07 07:08:36

Oui, il est possible, à encourager et à documenté . Je l'ai fait moi-même et l'a trouvé pour être très facile.

7
répondu Otto Allmendinger 2009-07-20 13:31:37

manuel de référence de L'API Python/C - L'API utilisée par les programmeurs C et C++ qui veulent écrire des modules d'extension ou intégrer Python.

extension et intégration de L'interpréteur Python

décrit comment écrire des modules en C ou C++ pour étendre L'interpréteur Python avec de nouveaux modules. Ces modules peuvent définir de nouvelles fonctions, mais aussi de nouveaux types d'objets et leurs méthodes. Document décrit également comment intégrer L'interpréteur Python dans une autre application, pour utilisation comme langage d'extension. Enfin, il montre comment compiler et relier les modules d'extension de manière à ce qu'ils puissent être chargés dynamiquement (au moment de l'exécution) dans l'interpréteur, si le système d'exploitation sous-jacent supporte cette fonctionnalité.

3
répondu gimel 2009-07-20 13:31:48

Essayer Pyrex . Facilite l'écriture D'extensions C++ pour Python.

3
répondu Brian 2009-07-20 13:31:53

nous utilisons swig avec beaucoup de succès dans notre produit.

en gros, swig prend votre code C++ et génère un enveloppement python.

3
répondu Alan 2009-07-20 14:52:10

voir ceci:

Extension de Python avec C ou C++

" il est assez facile d'ajouter de nouveaux modules intégrés à Python, Si vous savez programmer en C. Ces modules d'extension peuvent faire deux choses qui ne peuvent pas être faites directement en Python: ils peuvent implémenter de nouveaux types d'objets intégrés, et ils peuvent appeler des fonctions de bibliothèque C et des appels système.

pour prendre en charge les extensions, L'API Python (Application Programmers Interface) définit un ensemble des fonctions, macros et variables qui permettent d'accéder à la plupart des aspects du système D'exécution Python. L'API Python est incorporée dans un fichier source C en incluant l'en-tête "Python.h." "

http://www.python.org/doc/2.5.2/ext/intro.html

PS C'est de l'épeautre "intégrer" :)

2
répondu Larry Watanabe 2009-07-20 13:33:47

j'ai utilisé PyCxx http://cxx.sourceforge.net / dans le passé et j'ai trouvé qu'il était très bon.

il enveloppe l'API python c d'une manière très élégante et le rend très simple à utiliser. Il est très facile d'écrire l'extension python en c++. Il est fourni avec des exemples clairs de sorte qu'il est facile de commencer.

j'ai vraiment aimé utiliser cette bibliothèque et je la recommande.

2
répondu luc 2009-09-29 20:07:54

cela dépend de vos exigences de portabilité. J'ai du mal avec ça depuis un moment, et j'ai fini par emballer mon C++ en utilisant le API python directement parce que j'ai besoin de quelque chose qui fonctionne sur les systèmes où l'administrateur a seulement hacké ensemble une installation gcc et python qui fonctionne principalement.

Dans la théorie de Boost.Python devrait être une très bonne option, puisque Boost est disponible (presque) partout. Malheureusement, si vous finissez sur un OS avec un plus ancien par défaut installation python (notre collaboration est bloquée avec 2.4), vous rencontrerez des problèmes si vous essayez D'exécuter Boost.Python avec une version plus récente (nous utilisons tous Python 2.6). Puisque votre administrateur n'a probablement pas pris la peine d'installer une version de Boost correspondant à chaque version de python, vous devrez la construire vous-même.

donc si cela ne vous dérange pas d'avoir éventuellement besoin de quelques réglages de Boost sur chaque système sur lequel votre code tourne, utilisez Boost.Python. Si vous voulez du code cela fonctionnera certainement sur n'importe quel système avec Python et un compilateur C++, utilisez L'API Python.

2
répondu Shep 2012-03-01 09:31:20

je recommande de regarder comment PyTorch fait leur intégration.

2
répondu Andrei Pokrovsky 2017-10-05 19:57:23

une autre façon intéressante de faire est de générer du code python en exécutant python lui-même pour analyser les fichiers d'en-tête c++. L'équipe OpenCV a réussi cette approche et maintenant ils ont fait exactement la même chose pour faire Java wrapper pour la bibliothèque OpenCV. J'ai trouvé cette API de Python propre créée sans limitation causée par une certaine bibliothèque.

1
répondu Tae-Sung Shin 2013-08-15 21:37:47

vous pouvez écrire extensions Python en C++. Fondamentalement Python lui-même est écrit en C et vous pouvez l'utiliser pour appeler dans votre code C. Vous avez un accès complet à vos objets Python. Vérifier aussi Boost.Python .

1
répondu Matt Price 2017-01-08 19:42:49