pybind11 — C++11 和 Python 之间的无缝操作
安装工具示例 • Scikit-build 示例 • CMake 示例
pybind11是一个轻量级的纯头文件库,它在 Python 中公开 C++ 类型,反之亦然,主要是为了创建现有 C++ 代码的 Python 绑定。它的目标和语法类似于 David Abrahams 的优秀 Boost.Python 库:通过使用编译时自省推断类型信息来最小化传统扩展模块中的样板代码。
Boost.Python 的主要问题以及创建此类类似项目的原因是 Boost。 Boost 是一套非常庞大且复杂的实用程序库,几乎可以与现有的所有 C++ 编译器配合使用。这种兼容性是有代价的:需要神秘的模板技巧和解决方法来支持最古老和最有缺陷的编译器样本。现在,兼容 C++11 的编译器已广泛使用,这种重型机器已成为过大且不必要的依赖项。
将此库视为 Boost.Python 的一个小型独立版本,其中剥离了与绑定生成无关的所有内容。如果没有注释,核心头文件只需要约 4K 行代码,并依赖于 Python(3.8+ 或 PyPy)和 C++ 标准库。这种紧凑的实现得益于一些 C++11 语言功能(特别是:元组、lambda 函数和可变参数模板)。自创建以来,该库在许多方面已经超越了 Boost.Python,从而在许多常见情况下大大简化了绑定代码。
pybind11.readthedocs.io 提供了教程和参考文档。此处提供了该手册的 PDF 版本。源代码始终可以在 github.com/pybind/pybind11 上找到。
pybind11 可以将以下核心 C++ 功能映射到 Python:
std::shared_ptr
除了核心功能之外,pybind11 还提供了一些额外的好处:
constexpr
),从而生成更小的二进制文件。该项目由 Wenzel Jakob 创建。代码的重要功能和/或改进由 Jonas Adler、Lori A. Burns、Sylvain Corlay、Eric Cousineau、Aaron Gokaslan、Ralf Grosse-Kunstleve、Trent Houliston、Axel Huebl、@hulucc、Yannick Jadoul、Sergey Lyskov、Johan 贡献马比尔、托马斯·米亚斯科、迪恩·莫尔多万、本·普里查德、杰森莱茵兰德、鲍里斯·谢林、皮姆·谢拉特、亨利·施赖纳、伊万·斯米尔诺夫、鲍里斯·斯塔莱克和帕特里克·斯图尔特。
我们感谢 Google 为本项目使用的持续集成基础设施提供了慷慨的财政捐助。
有关构建和贡献 pybind11 的信息,请参阅贡献指南。
pybind11 是根据 BSD 风格的许可证提供的,可以在 LICENSE 文件中找到该许可证。通过使用、分发或为本项目做出贡献,您同意本许可的条款和条件。