跳转到主要内容

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(一个庞大的 Boost.Python 绑定项目)的 pybind11 转换报告了二进制文件大小减少了 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 或更高版本(ICC 20.2 在 CI 中测试过)

  5. Cygwin/GCC(以前在 2.5.1 上测试过)

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

  7. 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 文件中找到。通过使用、分发或贡献本项目,您同意本许可协议的条款和条件。

项目详细信息


发布历史 发布通知 | RSS 源

下载文件

下载您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分布

pybind11-2.13.6.tar.gz (218.4 kB 查看哈希值)

上传时间

构建分布

pybind11-2.13.6-py3-none-any.whl (243.3 kB 查看哈希值)

上传时间 Python 3

由以下支持