跳转到主要内容

C++11和Python之间无缝操作

项目描述

pybind11 logo

pybind11 — C++11和Python之间无缝操作

Latest Documentation Status Stable Documentation Status Gitter chat GitHub Discussions CI Build status

Repology PyPI package Conda-forge Python Versions

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 对象一样进行序列化和反序列化。

支持的编译器

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

  2. GCC 4.8 或更高版本

  3. Microsoft Visual Studio 2017 或更高版本

  4. Intel 经典 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 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 (218.7 kB 查看散列)

上传时间

构建分布

pybind11_global-2.13.6-py3-none-any.whl (439.5 kB 查看散列)

上传时间 Python 3