pybind11 — Fonctionnement transparent entre C++11 et Python
Exemple de setuptools • Exemple de construction Scikit • Exemple de CMake
pybind11 est une bibliothèque légère d'en-tête uniquement qui expose les types C++ en Python et vice versa, principalement pour créer des liaisons Python à partir du code C++ existant. Ses objectifs et sa syntaxe sont similaires à l'excellente bibliothèque Boost.Python de David Abrahams : minimiser le code passe-partout dans les modules d'extension traditionnels en déduisant les informations de type à l'aide de l'introspection au moment de la compilation.
Le principal problème de Boost.Python, et la raison de la création d'un projet similaire, est Boost. Boost est une suite extrêmement vaste et complexe de bibliothèques d'utilitaires qui fonctionne avec presque tous les compilateurs C++ existants. Cette compatibilité a un coût : des astuces et des solutions de contournement obscures sont nécessaires pour prendre en charge les spécimens de compilateur les plus anciens et les plus bogués. Maintenant que les compilateurs compatibles C++ 11 sont largement disponibles, cette machinerie lourde est devenue une dépendance excessivement importante et inutile.
Considérez cette bibliothèque comme une petite version autonome de Boost.Python avec tout ce qui n'est pas pertinent pour la génération de liaisons. Sans commentaires, les fichiers d'en-tête principaux ne nécessitent qu'environ 4 000 lignes de code et dépendent de Python (3.8+ ou PyPy) et de la bibliothèque standard C++. Cette implémentation compacte a été possible grâce à certaines fonctionnalités du langage C++11 (notamment : tuples, fonctions lambda et modèles variadiques). Depuis sa création, cette bibliothèque s'est développée au-delà de Boost.Python à bien des égards, conduisant à un code de liaison considérablement plus simple dans de nombreuses situations courantes.
Un didacticiel et une documentation de référence sont fournis sur pybind11.readthedocs.io. Une version PDF du manuel est disponible ici. Et le code source est toujours disponible sur github.com/pybind/pybind11.
pybind11 peut mapper les fonctionnalités de base C++ suivantes à Python :
std::shared_ptr
En plus des fonctionnalités de base, pybind11 fournit quelques avantages supplémentaires :
constexpr
), ce qui conduit à des binaires plus petits.Ce projet a été créé par Wenzel Jakob. Des fonctionnalités et/ou améliorations importantes du code ont été apportées par Jonas Adler, Lori A. Burns, Sylvain Corlay, Eric Cousineau, Aaron Gokaslan, Ralf Grosse-Kunstleve, Trent Houliston, Axel Huebl, @hulucc, Yannick Jadoul, Sergey Lyskov, Johan. Mabille, Tomasz Miąsko, Dean Moldave, Ben Pritchard, Jason Rhinelander, Boris Schäling, Pim Schellart, Henry Schreiner, Ivan Smirnov, Boris Staletic et Patrick Stewart.
Nous remercions Google pour sa généreuse contribution financière à l'infrastructure d'intégration continue utilisée par ce projet.
Consultez le guide de contribution pour plus d'informations sur la création et la contribution à pybind11.
pybind11 est fourni sous une licence de style BSD qui se trouve dans le fichier LICENSE. En utilisant, distribuant ou contribuant à ce projet, vous acceptez les termes et conditions de cette licence.