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++ 类型。

支持的编译器 #

  1. Clang/LLVM 3.3 或更高版本 (对于 Apple Xcode Clang,这是 5.0.0 或更高版本)

  2. GCC 4.8 或更高版本

  3. 微软 Visual Studio 2017 或更高版本

  4. ICC (英特尔经典 C++) 编译器 18 或更高版本 (在 CI 中有测试 ICC 20.2)

  5. Cygwin/GCC (先前在 2.5.1 有测试)

  6. NVCC (在 CI 中有测试 CUDA 11.0)

  7. 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 文件。通过使用、分发或对此工程做贡献,即表示您同意此许可的条款和条件。

内容:

基本

高级话题

额外信息