C++11和Python之间的无缝兼容性
项目描述
pybind11 — C++11与Python之间无缝的互操作性
Setuptools示例 • Scikit-build示例 • CMake示例
pybind11是一个轻量级的头文件库,它将C++类型暴露给Python,反之亦然,主要用于创建现有C++代码的Python绑定。它的目标和语法与David Abrahams编写的优秀库Boost.Python相似:通过编译时内省推断类型信息,以最小化传统扩展模块中的样板代码。
Boost.Python的主要问题——以及创建这样一个类似项目的原因——是Boost。Boost是一个庞大的、复杂的实用程序库系列,几乎与现有的所有C++编译器兼容。这种兼容性有其代价:需要使用神秘的模板技巧和解决方案来支持最古老、最易出错的编译器样本。现在,C++11兼容的编译器已经广泛可用,这种重型机械已经变得过于庞大且不必要。
将这个库想象成一个去除了所有与绑定生成无关内容的Boost.Python的微小自包含版本。在不添加注释的情况下,核心头文件仅需要约4K行代码,并依赖于Python(3.7+,或PyPy)和C++标准库。这种紧凑的实现得益于一些C++11语言特性(特别是:元组、lambda函数和变长模板)。自从它的创建以来,这个库在许多方面已经超越了Boost.Python,导致许多常见情况下的绑定代码大大简化。
教程和参考文档可在pybind11.readthedocs.io找到。手册的PDF版本在此处提供。源代码始终可在github.com/pybind/pybind11获取。
核心功能
pybind11可以将以下核心C++特性映射到Python
接受和返回自定义数据结构(按值、引用或指针)的函数
实例方法和静态方法
重载函数
实例属性和静态属性
任意异常类型
枚举
回调
迭代器和范围
自定义运算符
单继承和多继承
STL数据结构
具有引用计数的智能指针,如std::shared_ptr
具有正确引用计数的内部引用
具有虚拟(和纯虚拟)方法的C++类可以在Python中扩展
集成NumPy支持(NumPy 2需要pybind11 2.12+)
附加功能
除了核心功能外,pybind11还提供了一些额外功能
支持Python 3.7+和PyPy3 7.3的接口实现无关性(pybind11 2.9是最后一个支持Python 2和3.5的版本)。
可以绑定C++11 lambda函数,并捕获变量。lambda捕获的数据存储在生成的Python函数对象中。
pybind11在可能的情况下使用C++11的移动构造函数和移动赋值运算符,以有效地传输自定义数据类型。
可以通过Python的缓冲协议轻松暴露自定义数据类型的内部存储。这对于快速在C++矩阵类(如Eigen)和NumPy之间进行转换非常有用,无需昂贵的复制操作。
pybind11可以自动矢量化函数,以便它们可以透明地应用于一个或多个NumPy数组参数的所有条目。
只需几行代码即可支持Python基于切片的访问和赋值操作。
所有内容都包含在几个头文件中;无需链接任何其他库。
二进制文件通常比由 Boost.Python 生成的等效绑定小至少2倍。最近,PyRosetta(一个庞大的 Boost.Python 绑定项目)的 pybind11 转换报告了二进制文件大小减少了 5.4倍,编译时间减少了 5.8倍。
函数签名在编译时预先计算(使用 constexpr),从而生成更小的二进制文件。
只需做少量额外工作,C++类型就可以像常规 Python 对象一样进行序列化和反序列化。
支持的编译器
Clang/LLVM 3.3 或更高版本(对于 Apple Xcode 的 clang,这是 5.0.0 或更高版本)
GCC 4.8 或更高版本
Microsoft Visual Studio 2017 或更高版本
Intel 经典 C++ 编译器 18 或更高版本(ICC 20.2 在 CI 中测试过)
Cygwin/GCC(以前在 2.5.1 上测试过)
NVCC(CUDA 11.0 在 CI 中测试过)
NVIDIA PGI(20.9 在 CI 中测试过)
关于
该项目由 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 Miąsko、Dean Moldovan、Ben Pritchard、Jason Rhinelander、Boris Schäling、Pim Schellart、Henry Schreiner、Ivan Smirnov、Boris Staletic 和 Patrick Stewart 贡献了重要的功能或代码改进。
我们感谢 Google 为该项目使用的持续集成基础设施慷慨捐款。
贡献
有关构建和贡献 pybind11 的信息,请参阅 贡献指南。
许可证
pybind11 在 BSD 风格的许可下提供,许可文件可在 LICENSE 文件中找到。通过使用、分发或贡献本项目,您同意本许可协议的条款和条件。
项目详细信息
下载文件
下载您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。