pybind11 – Nahtlose Bedienbarkeit zwischen C++11 und Python
Setuptools-Beispiel • Scikit-Build-Beispiel • CMake-Beispiel
pybind11 ist eine leichte Header-Bibliothek, die C++-Typen in Python und umgekehrt verfügbar macht, hauptsächlich um Python-Bindungen für vorhandenen C++-Code zu erstellen. Seine Ziele und Syntax ähneln der hervorragenden Boost.Python-Bibliothek von David Abrahams: Minimierung des Boilerplate-Codes in herkömmlichen Erweiterungsmodulen durch Ableitung von Typinformationen mithilfe der Introspektion zur Kompilierungszeit.
Das Hauptproblem bei Boost.Python – und der Grund für die Erstellung eines so ähnlichen Projekts – ist Boost. Boost ist eine enorm große und komplexe Suite von Dienstprogrammbibliotheken, die mit fast jedem existierenden C++-Compiler funktioniert. Diese Kompatibilität hat ihren Preis: Um die ältesten und fehlerhaftesten Compiler-Exemplare zu unterstützen, sind obskure Template-Tricks und Workarounds erforderlich. Da C++11-kompatible Compiler nun allgemein verfügbar sind, ist diese schwere Maschinerie zu einer übermäßig großen und unnötigen Abhängigkeit geworden.
Stellen Sie sich diese Bibliothek als eine winzige, eigenständige Version von Boost.Python vor, in der alles entfernt wurde, was für die Bindungsgenerierung nicht relevant ist. Ohne Kommentare erfordern die Kern-Header-Dateien nur ca. 4 KB Codezeilen und hängen von Python (3.8+ oder PyPy) und der C++-Standardbibliothek ab. Diese kompakte Implementierung war dank einiger C++11-Sprachfunktionen möglich (insbesondere: Tupel, Lambda-Funktionen und Variadic-Vorlagen). Seit ihrer Erstellung ist diese Bibliothek in vielerlei Hinsicht über Boost.Python hinaus gewachsen und hat in vielen gängigen Situationen zu deutlich einfacherem Bindungscode geführt.
Tutorial- und Referenzdokumentation finden Sie unter pybind11.readthedocs.io. Eine PDF-Version des Handbuchs finden Sie hier. Und der Quellcode ist immer unter github.com/pybind/pybind11 verfügbar.
pybind11 kann Python die folgenden Kernfunktionen von C++ zuordnen:
std::shared_ptr
Zusätzlich zur Kernfunktionalität bietet pybind11 einige zusätzliche Extras:
constexpr
), was zu kleineren Binärdateien führt.Dieses Projekt wurde von Wenzel Jakob erstellt. Wesentliche Funktionen und/oder Verbesserungen des Codes wurden von Jonas Adler, Lori A. Burns, Sylvain Corlay, Eric Cousineau, Aaron Gokaslan, Ralf Grosse-Kunstleve, Trent Houliston, Axel Huebl, @hulucc, Yannick Jadoul, Sergey Lyskov und Johan beigesteuert Mabille, Tomasz Miąsko, Dean Moldovan, Ben Pritchard, Jason Rhinelander, Boris Schäling, Pim Schellart, Henry Schreiner, Ivan Smirnov, Boris Staletic und Patrick Stewart.
Wir danken Google für einen großzügigen finanziellen Beitrag zur kontinuierlichen Integrationsinfrastruktur, die von diesem Projekt verwendet wird.
Informationen zum Erstellen und Mitwirken an pybind11 finden Sie im Beitragsleitfaden.
pybind11 wird unter einer BSD-ähnlichen Lizenz bereitgestellt, die in der LICENSE-Datei zu finden ist. Durch die Nutzung, Verbreitung oder Mitwirkung an diesem Projekt stimmen Sie den Bedingungen dieser Lizenz zu.