pybind11 — 无缝操作 C++11 和 Python
setuptools 范例 • Scikit 构建范例 • CMake 范例
pybind11 是轻量仅头库,它在 Python 中暴露 C++ 类型,反之亦然,主要用于创建现有 C++ 代码的 Python 绑定。它的目标和句法类似于优秀的 Boost.Python 库作者 David Abrhams:通过使用编译时自省推断类型信息,以最小化传统扩展模块中的样板代码。
Boost.Python 的主要问题 — 和创建这种类似工程的原因 — 是 Boost。Boost 是庞大且复杂的实用工具库套件,几乎工作于每个存在的 C++ 编译器。这种兼容性有代价:神秘的模板技巧和解决方案,对于支持最古老和最容易出错的编译器样本是必要的。现在,C++11 兼容编译器已广泛可用,这种笨重体系已变为过大且不必要的依赖。
认为此库是剥离了绑定生成无关的一切的,Boost.Python 的极小自包含版本。不带注释,核心头文件只有 ~4K 行代码,且依赖 Python (3.6+ 或 PyPy) 和 C++ 标准库。这种紧凑实现是可能的,由于一些新 C++11 语言特征 (具体包括:元组、Lambda 函数和可变模板)。自创建以来,此库在很多方面已超越 Boost.Python,导致在很多常见情况下可显著简化绑定代码。
教程和参考文档编制的提供在 pybind11.readthedocs.io 。手册的可用 PDF 版本 here 。始终可用的源代码在 github.com/pybind/pybind11 .
pybind11 可以将下列核心 C++ 特征映射到 Python:
接受并返回值、引用或指针的自定义数据结构的函数
实例方法和静态方法
重载函数
实例属性和静态属性
任意异常类型
枚举
回调
迭代器和范围
自定义运算符
单继承和多继承
STL (标准模板库) 数据结构
具有引用计数的智能指针,像
std::shared_ptr
具有正确引用计数的内部引用
可以扩展 Python 具有虚拟 (和纯虚拟) 方法的 C++ 类
除核心功能外,pybind11 还提供了一些额外优势:
通过实现不可知接口支持 Python 3.6+ 和 PyPy3 7.3 (pybind11 2.9 是支持 Python 2 和 3.5 的最后一个版本)。
绑定 C++11 Lambda 函数与捕获变量是可能的。Lambda 捕获数据存储在产生 Python 函数的对象中。
pybind11 使用 C++11 移动构造函数和移动赋值运算符,每当可能需要高效传输自定义数据类型时。
暴露自定义数据类型的内部存储很容易,透过 Python 缓冲协议。这很顺手,如像在 Eigen 和 NumPy 的 C++ 矩阵类之间的快速转换,无需昂贵拷贝操作。
pybind11 可以自动矢量化函数,所以将它们应用于一个或多个 NumPy 数组自变量的所有条目是透明的。
仅仅几行代码,就可以支持 Python 基于切片的访问和赋值操作。
一切都包含在几个头文件中;不需要链接到任何其它库。
二进制一般比由 Boost.Python 生成的等效绑定至少小 2 倍。最近 PyRosetta 的 pybind11 转换,巨大 Boost.Python 绑定工程, reported 二进制大小减少 5.4x 且编译时间减少 5.8x .
在编译时预计算函数签名 (使用
constexpr
),导致二进制更小。
只需很少的额外努力,就可以像常规 Python 对象一样腌制/取消腌制 C++ 类型。
Clang/LLVM 3.3 或更高版本 (对于 Apple Xcode Clang,这是 5.0.0 或更高版本)
GCC 4.8 或更高版本
微软 Visual Studio 2017 或更高版本
ICC (英特尔经典 C++) 编译器 18 或更高版本 (在 CI 中有测试 ICC 20.2)
Cygwin/GCC (先前在 2.5.1 有测试)
NVCC (在 CI 中有测试 CUDA 11.0)
NVIDIA PGI (在 CI 中有测试 20.9)
此工程的创建者是 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 Mabille、Tomasz misko、Dean Moldovan、Ben Pritchard、Jason Rhinelander、Boris Schäling、Pim Schellart、Henry Schreiner、Ivan Smirnov、Boris Staletic 及 Patrick Stewart。
感谢 Google 对用于此工程的持续集成基础设施的慷慨财务捐助。
见 贡献指南 了解构建和贡献 pybind11 的有关信息。
pybind11 的提供遵循 BSD 样式许可,可以找到在 LICENSE 文件。通过使用、分发或对此工程做贡献,即表示您同意此许可的条款和条件。
内容:
基本
高级话题
额外信息