pybind11是一个只有头文件的轻量级库,它在导出C++类型到Python的同时,也导出Python类型到C++中,其主要目的是建立现有C++代码的Python绑定。它与David Abrahams的Boost.Python库目的和语法相似,都是通过编译期内省来推断类型信息,以最大程度地降低传统扩展模块中的重复样板代码。

Boost.Python的问题主要在于Boost本身,这也是我创建一个类似项目的原因。Boost是一套庞大且复杂的工具库,它几乎兼容所有的C++编译器。但这种兼容性是有成本的:为了支持那些极其古老且充满BUG的编译器版本,Boost不得不使用各种晦涩难懂的模板技巧与变通方法。现在,支持C++11的编译器已经被广泛使用,这种沉重结构已成为一种过大且不必要的依赖。

你可以把pybind11库想象成Boost.Python的一个小型独立版本,其中所有与python绑定生成无关的内容都被删除了。不算注释,pybind11核心头文件大约只有4K行代码,并且它只依赖于Python(2.7或3.5+,或PyPy)和C ++标准库。由于C++11语言的新特性(特别是元组、lambda函数和可变参数模板),这种紧凑的实现才成为可能。自创建以来,这个库已经在很多方面超越了Boost.Python,多数常见情况下pybind11使得python绑定代码变得非常简单。

1.1 核心特性

pybind11可以将以下C++核心特性映射到Python:

  • 函数入参和返回值可以是自定义数据结构的值、引用或者指针;
  • 类成员方法和静态方法;
  • 重载函数;
  • 类成员变量和静态变量;
  • 任意异常类型;
  • 枚举;
  • 回调函数;
  • 迭代器和ranges;
  • 自定义操作符;
  • 单继承和多重继承;
  • STL数据结构;
  • 智能指针;
  • Internal references with correct reference counting;
  • 可以在Python中扩展带虚函数(和纯虚函数)的C++类;

1.2 好用的功能

除了上述核心功能外,pybind11还提供了一些好用的功能:

  • 支持Python2.7, 3.5+, PyPy/PyPy3 7.3与实现无关的接口。
  • 可以绑定带捕获参数的lambda函数,lambda捕获的数据存储生成的Python函数对象中。
  • pybind11使用C++11移动构造函数和移动运算符,尽可能有效的转换自定义数据类型。(pybind11 uses C++11 move constructors and move assignment operators whenever possible to efficiently transfer custom data types.)
  • 通过Python的buffer协议,可以很轻松地获取自定义类型的内存指针。这样,我们可以很方便地在C++矩阵类型(如Eigen)和NumPy之间快速转换,而无需昂贵的拷贝操作。
  • pybind11可以自动将函数矢量化,以便它们透明地应用于以NumPy数组为参数的所有条目。
  • 只需几行代码就可以支持Python基于切片的访问和赋值操作。
  • 使用时只需要包含几个头文件即可,不用链接任何其他的库。
  • 相比Boost.Python,生成的库文件更小,编译更快。
  • 使用constexpr在编译器与计算函数签名,进一步减小了库文件大小。
  • 可以轻松地让C++类型支持Python pickle和unpickle操作。

1.3 支持的编译器

  1. Clang/LLVM 3.3以上 (Apple Xcode’s clang需要5.0.0以上版本)
  2. GCC 4.8以上
  3. Microsoft Visual Studio 2015 Update 3以上
  4. Intel classic C++ compiler 18 or newer (ICC 20.2 tested in CI)
  5. Cygwin/GCC (previously tested on 2.5.1)
  6. NVCC (CUDA 11.0 tested in CI)
  7. NVIDIA PGI (20.9 tested in CI)

1.4 关于

This project was created by Wenzel Jakob. Significant features and/or improvements to the code were contributed by 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, and Patrick Stewart.

We thank Google for a generous financial contribution to the continuous integration infrastructure used by this project.

1.5 贡献

See the contributing guide for information on building and contributing to pybind11.

1.6 License

pybind11 is provided under a BSD-style license that can be found in the LICENSE file. By using, distributing, or contributing to this project, you agree to the terms and conditions of this license.

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。