pybind/pybind11

GitHub: pybind/pybind11

轻量级仅头文件的 C++11 库,用于在 C++ 和 Python 之间创建无缝绑定,是 Boost.Python 的现代替代方案。

Stars: 17755 | Forks: 2285

.. figure:: https://github.com/pybind/pybind11/raw/master/docs/pybind11-logo.png :alt: pybind11 logo **pybind11 (v3) — C++ 与 Python 之间的无缝互操作性** |Latest Documentation Status| |Stable Documentation Status| |Gitter chat| |GitHub Discussions| |CI| |Build status| |SPEC 4 — Using and Creating Nightly Wheels| |Repology| |PyPI package| |Conda-forge| |Python Versions| `Setuptools 示例 `_ • `Scikit-build 示例 `_ • `CMake 示例 `_ .. start **pybind11** 是一个轻量级的仅包含头文件的库,它在 Python 中暴露 C++ 类型,反之亦然,主要是为现有的 C++ 代码创建 Python 绑定。其目标和语法与 David Abrahams 编写的优秀的 `Boost.Python `_ 库相似:通过使用编译时内省推断类型信息,最大限度地减少传统扩展模块中的样板代码。 Boost.Python 的主要问题——也是创建这样一个类似项目的原因——就是 Boost。Boost 是一个极其庞大且复杂的实用程序库套件,几乎可以与现有的所有 C++ 编译器配合使用。这种兼容性是有代价的:为了支持最古老和错误最多的编译器,必须使用晦涩的模板技巧和变通方法。既然支持 C++11 的编译器已广泛可用,这种沉重的机制就变成了一个过大且不必要的依赖项。 可以将此库视为 Boost.Python 的一个微小的独立版本,其中剥离了所有与绑定生成无关的内容。在不包含注释的情况下,核心头文件仅需约 4K 行代码,并且仅依赖于 Python(CPython 3.8+、PyPy 或 GraalPy)和 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 还提供了一些额外的特色功能: - 支持带有与实现无关接口的 CPython 3.8+、PyPy3 7.3.17+ 和 GraalPy 24.1+(旧版 CPython 和 PyPy 版本请参阅旧版本说明)。 - 可以绑定带有捕获变量的 C++11 lambda 函数。lambda 捕获的数据存储在生成的 Python 函数对象内部。 - pybind11 尽可能使用 C++11 移动构造函数和移动赋值运算符,以高效传输自定义数据类型。 - 通过 Python 的缓冲区协议(buffer protocols)暴露自定义类型的内部存储非常简单。这对于例如 Eigen 和 NumPy 等 C++ 矩阵类之间的快速转换非常方便,无需昂贵的复制操作。 - pybind11 可以自动对函数进行向量化,使其透明地应用于一个或多个 NumPy 数组参数的所有条目。 - 只需几行代码即可支持 Python 基于切片的访问和赋值操作。 - 所有内容都包含在几个头文件中;无需链接任何额外的库。 - 与 Boost.Python 生成的等效绑定相比,二进制文件通常至少小两倍。最近对 PyRosetta(一个庞大的 Boost.Python 绑定项目)进行的 pybind11 转换 `报告 `_ 称二进制大小减少了 **5.4 倍**,编译时间减少了 **5.8 倍**。 - 函数签名在编译时(使用 ``constexpr``)预计算,从而生成更小的二进制文件。 - 只需少量额外工作,C++ 类型就可以像常规 Python 对象一样进行 pickle 和 unpickle。 ## 支持的平台与编译器 pybind11 在一系列操作系统、Python 版本、C++ 标准和工具链中通过持续集成进行测试。有关我们当前测试组合的最新视图,请参阅 `pybind11 GitHub Actions `_ 日志。 随着旧的平台和编译器逐渐淘汰以及社区添加新的平台和编译器,测试矩阵会随时间自然演变。与受测编译器或平台密切相关的版本在实践中通常也能正常工作,但我们无法承诺验证所有可能的组合。如果您依赖的配置在矩阵中缺失或出现退步,非常欢迎提交问题和拉取请求以扩展覆盖范围。同时,我们需要在测试矩阵的大小与可用的 CI 资源(例如 GitHub 免费层级下的并发作业限制)之间取得平衡。 ## 关于 本项目由 `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、 Dustin Spicuzza、 Boris Staletic、 Ethan Steinberg、 Patrick Stewart、 Ivor Wanders、 以及 Xiaofei Wang。 我们感谢 Google 为本项目使用的持续集成基础设施提供了慷慨的资金支持。 ### 贡献 有关构建 pybind11 以及为其做出贡献的信息,请参阅 `贡献指南 `_。 ### 许可证 pybind11 根据 BSD 风格的许可证提供,该许可证可在 `LICENSE `_ 文件中找到。通过使用、分发或为本项目做出贡献,即表示您同意本许可证的条款和条件。 .. |Latest Documentation Status| image:: https://readthedocs.org/projects/pybind11/badge?version=latest :target: http://pybind11.readthedocs.org/en/latest .. |Stable Documentation Status| image:: https://img.shields.io/badge/docs-stable-blue.svg :target: http://pybind11.readthedocs.org/en/stable .. |Gitter chat| image:: https://img.shields.io/gitter/room/gitterHQ/gitter.svg :target: https://gitter.im/pybind/Lobby .. |CI| image:: https://github.com/pybind/pybind11/workflows/CI/badge.svg :target: https://github.com/pybind/pybind11/actions .. |Build status| image:: https://ci.appveyor.com/api/projects/status/riaj54pn4h08xy40?svg=true :target: https://ci.appveyor.com/project/wjakob/pybind11 .. |PyPI package| image:: https://img.shields.io/pypi/v/pybind11.svg :target: https://pypi.org/project/pybind11/ .. |Conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/pybind11.svg :target: https://github.com/conda-forge/pybind11-feedstock .. |Repology| image:: https://repology.org/badge/latest-versions/python:pybind11.svg :target: https://repology.org/project/python:pybind11/versions .. |Python Versions| image:: https://img.shields.io/pypi/pyversions/pybind11.svg :target: https://pypi.org/project/pybind11/ .. |GitHub Discussions| image:: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github :target: https://github.com/pybind/pybind11/discussions .. |SPEC 4 — Using and Creating Nightly Wheels| image:: https://img.shields.io/badge/SPEC-4-green?labelColor=%23004811&color=%235CA038 :target: https://scientific-python.org/specs/spec-0004/
标签:API生成, Bash脚本, Boost.Python, C++, C++11, CMake, CPython, FFI, Header-only, Introspection, LangChain, pybind11, Python, Python包装器, 互操作性, 代码封装, 元编程, 反射, 外部函数接口, 头文件库, 开源库, 扩展模块, 搜索引擎爬虫, 数据擦除, 无后门, 模板元编程, 混合编程, 类型推断, 绑定, 编译器, 胶水代码, 跨语言调用, 轻量级, 逆向工具, 高性能计算