Quelqu'un peut-il me donner des conseils sur les outils ou le logiciel à utiliser pour étendre Python avec C / C ++? Merci. P>
9 Réponses :
Nous utilisons Swig pour envelopper nos bibliothèques C / C ++ pour une utilisation dans Python. Ça marche assez bien. P>
Le site Web de Python lui-même a un superbe Ensemble d'exemples , ainsi que Documentation API . C'est littéralement tout ce que j'ai utilisé quand j'avais besoin d'écrire des extensions C. P>
Oh, je pensais que tu voulais dire figurativement, merci pour la clarification
Le code écrit à la main est le meilleur si la bibliothèque n'est pas extraordinaire grande (comme QT ou WxWidgets).
Oui, vous en avez besoin: http://www.python.org/doc/ext/ p>
et bien sûr aussi un compilateur C / C ++. P>
Si vous décrivez ce que vous essayez de faire, et quel type d'extensions vous faites, je suis sûr que les gens peuvent vous donner plus d'informations. P>
Il y a des choses comme Swig pour envelopper des bibliothèques, si c'est ce que vous voulez faire. Si vous voulez juste des exclusions, C est souvent la réponse, mais pas toujours, etc. p>
Je vais ajouter la référence obligatoire à Boost. Python pour des trucs C ++. P>
J'ai commencé à utiliser Boost.python il y a quelques jours et je suis déjà opérationnel.
Il existe de nombreuses solutions. En général, vous devez l'éviter si possible, car les extensions C d'écriture C sont fastidieuses. Souvent, il est nécessaire d'utiliser une bibliothèque tierce. Dans ce cas, je pense que la solution gagnante est aujourd'hui CYTHON . P>
Cython est une langue qui "ressemble à Python", mais peut être faite beaucoup plus rapide en utilisant la dactylographie facultative. Vous pouvez appeler directement C fonctionner à l'intérieur et la majeure partie du comptage de référence (le problème difficile en extensions C) est effectué automatiquement. Dans mon expérience, c'est bien mieux que Boost.python, Swig ou Ctypès: P>
Avec Cython, vous pouvez utiliser des objets Python (liste, dict, etc.) pour envelopper votre bibliothèque C. Bien sûr, il est également très utile que vous devez écrire votre propre extension uniquement pour des raisons rapides. Dans la communauté scientifique python, je pense que Cyron est devenu l'outil de choix lorsque la vitesse est nécessaire. P>
Dire "Vous devriez l'éviter si possible" sans connaître les raisons pour lesquelles l'OP veut le faire en premier lieu est erroné. Il y a une raison pour laquelle Python prend en charge les extensions C, et c'est parce que parfois une extension C est la meilleure solution, auquel cas il ne doit pas être évité. De plus, CTTYPES a beaucoup d'avantages sur Cyron selon le contexte, sans lequel il est erroné de dire que l'un est meilleur (voir
Je vois que personne n'a encore signalé une de mes solutions préférées pour l'enveloppe C ++ Code, SIP < / a> (Je crois que cela fonctionne également pour l'enveloppement C, comme Swig et contrairement à booster, mais je ne l'ai jamais utilisé comme ça). C'est le logiciel d'outils de la rivière Tool développé pour fabriquer Pyqt, l'interface Python au magnifique framework plate-forme de plate-forme QT C ++ - c'est donc un choix naturel si votre code C ++ utilise n'importe quelle fonctionnalité QT, tout comme Boost Python est le choix naturel si votre code C ++ utilise boost. p>
Swig est ce que nous utilisons au travail (une décision raisonnable quand elle a été faite il y a 10 ans ;-) et a l'avantage théorique qu'il peut également envelopper le code C ou C ++ à utiliser depuis Java, Perl, TCL, etc. Mais si vous vous souciez que de Python, il est difficile de voir quoi que ce soit pour le faire se démarquer. P>
Si vous venez d'envelopper une dll existante / donc, outre Cyron, quelles autres réponses ont souligné (et j'approuve, mais - cela change très vite ces jours-ci, alors faites attention si vous avez besoin de quelque chose de plus stable), Considérez le module de fonction standard CTTYPES - Je ne l'utiliserais pas pour un travail très étendu ( Erreurs "Oops" qu'un compilateur C ou C ++ signalerait que vous puissiez causer des accidents d'exécution avec CTTYPES), mais pour les petits emplois, c'est génial (et très pratique car il est livré avec des distributions standard de Python! -). P>
La bonne vieille Api n'est pas morte, je viens de me rencontrer aujourd'hui avec l'affaire, le grand gars qui fait la plupart des cours de course récemment pour mon bon vieux projet open source GMPY , et ensemble, nous avons décidé de rester avec l'API C pendant au moins la prochaine version de GMPY - Nous allons envisager de passer à Cyron lorsqu'il se stabilise , mais nous avons convenu que le commutateur serait toujours un peu prématurément maintenant. (Nous n'avons même pas pensé à une autre alternative, car le point principal de GMPY est d'être aussi aveuglé que possible, car nous pouvons éventuellement le faire! -). P>
Que pensez-vous de Siboken, l'équivalent pour le pyside? Pyside.org/docs/shiboken
@CRAIG, ne l'a pas encore essayé, je prévois quand je dois ensuite faire quelques œuvres de QT (me donnant ainsi une chance réaliste d'essayer un pyside).
Désolé pour la faute de frappe, je voulais dire "shiboken". Le pyside semble prometteur; Je suis juste désolé qu'ils doivent réinventer la roue.
J'ai utilisé pycxx dans le passé et j'ai vraiment apprécié d'utiliser cette lib. p>
À mon avis, il est plus facile d'utiliser que Swig. Je ne peux pas vraiment comparer à Boost.python parce que je n'ai jamais vraiment utilisé de booster. Je pense que Pycxx est plus léger que Boost.python, mais je me trompe peut-être. P>
Le point clé avec pycxx est qu'il s'agit d'une emballeuse C ++ de l'API Python C. Il est orienté objet et cache tout le mécanisme difficile. Il est assez intuitif pour un programmeur Python. Il est très facile à utiliser et il y a de bons exemples pour commencer. P>
Je recommande Pycxx comme citoyen de première classe pour faire une extension Python en C ++. P>
Je suis surpris que personne n'a mentionné pybind11 encore. Pybind11 est incroyable ! P>
de leurs documents: p>
Pybind11 est une bibliothèque d'en-tête légère qui expose les types C ++ en Python et inversement, principalement pour créer des fixations de Python du code C ++ existant. Ses buts et ses syntaxes sont similaires à l'excellente bibliothèque Boost.python de David Abrahams: pour minimiser le code de la chaudron dans des modules de rallonge traditionnels en inferrant des informations de type à l'aide de l'introspection du temps de compilation. P> blockQuote>
... p>
Pensez à cette bibliothèque comme une minuscule version autonome de Boost.python avec tout ce qui est dépouillé qui n'est pas pertinent pour la génération contraignante. Sans commentaire, les fichiers d'en-tête de base ne nécessitent que ~ 4K lignes de code et dépendent de Python (2.7 ou 3.x ou pyy2.7> = 5.7) et la bibliothèque standard C ++. P> blockQuote>
Vérifiez Pybind11 GitHub Repo, il y a beaucoup d'informations et une liste complète de Caractéristiques A > et goodies . P>
Documentation avec des exemples peut être trouvé ici . P>
Lorsque vous lisez docs.python.org/c-api quels problèmes avez-vous eu?
Cyron est une bonne option pour le faire! En fait, j'ai écrit un petit post à ce sujet, couvrant tous les détails de la rédaction de fichiers source Cython pour les construire, l'écriture Setup.py - Basicaly tout ce que vous devez envelopper une bibliothèque C / C ++ avec Cyron: martinsosic.com/development/2016/02/08/... a >