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 的最近 pybind11 转换,这是一个庞大的 Boost.Python 绑定项目,报告 二进制文件大小减少了 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 或更高版本(在 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 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 文件中找到。通过使用、分发或向此项目贡献,您同意此许可协议的条款和条件。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
pybind11_global-2.13.6.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | cf5f33432817eadd21077e4af037af134261d4527308cb3995dfbb4f3239aa87 |
|
MD5 | 6cb2087ff4cd5e4d155d188b2ccd909b |
|
BLAKE2b-256 | 73640c8b282908a6b2d6140bcffad9a6eceecdb64379d388a8d4bea938cfc54d |