pybind11 README

The project's README from github.com/pybind/pybind11. As one markdown file: README.md.

.. figure:: https://github.com/pybind/pybind11/raw/master/docs/pybind11-logo.png :alt: pybind11 logo

pybind11 (v3) — Seamless interoperability between C++ and 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 example <https://github.com/pybind/python_example>_ • Scikit-build example <https://github.com/pybind/scikit_build_example>_ • CMake example <https://github.com/pybind/cmake_example>_

.. start

pybind11 is a lightweight header-only library that exposes C++ types in Python and vice versa, mainly to create Python bindings of existing C++ code. Its goals and syntax are similar to the excellent Boost.Python <http://www.boost.org/doc/libs/1_58_0/libs/python/doc/>_ library by David Abrahams: to minimize boilerplate code in traditional extension modules by inferring type information using compile-time introspection.

The main issue with Boost.Python—and the reason for creating such a similar project—is Boost. Boost is an enormously large and complex suite of utility libraries that works with almost every C++ compiler in existence. This compatibility has its cost: arcane template tricks and workarounds are necessary to support the oldest and buggiest of compiler specimens. Now that C++11-compatible compilers are widely available, this heavy machinery has become an excessively large and unnecessary dependency.

Think of this library as a tiny self-contained version of Boost.Python with everything stripped away that isn't relevant for binding generation. Without comments, the core header files only require ~4K lines of code and depend on Python (CPython 3.9+, PyPy, or GraalPy) and the C++ standard library. This compact implementation was possible thanks to some C++11 language features (specifically: tuples, lambda functions and variadic templates). Since its creation, this library has grown beyond Boost.Python in many ways, leading to dramatically simpler binding code in many common situations.

Tutorial and reference documentation is provided at pybind11.readthedocs.io <https://pybind11.readthedocs.io/en/latest>. A PDF version of the manual is available here <https://pybind11.readthedocs.io/_/downloads/en/latest/pdf/>. And the source code is always available at github.com/pybind/pybind11 <https://github.com/pybind/pybind11>_.

Core features

pybind11 can map the following core C++ features to Python:

Goodies

In addition to the core functionality, pybind11 provides some extra goodies:

Supported platforms & compilers

pybind11 is exercised in continuous integration across a range of operating systems, Python versions, C++ standards, and toolchains. For an up-to-date view of the combinations we currently test, please see the pybind11 GitHub Actions <https://github.com/pybind/pybind11/actions?query=branch%3Amaster>_ and AppVeyor <https://ci.appveyor.com/project/wjakob/pybind11>_ logs.

The test matrix naturally evolves over time as older platforms and compilers fall out of use and new ones are added by the community. Closely related versions of a tested compiler or platform will often work as well in practice, but we cannot promise to validate every possible combination. If a configuration you rely on is missing from the matrix or regresses, issues and pull requests to extend coverage are very welcome. At the same time, we need to balance the size of the test matrix with the available CI resources, such as GitHub's limits on concurrent jobs under the free tier.

About

This project was created by Wenzel Jakob <http://rgl.epfl.ch/people/wjakob>_. 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, Dustin Spicuzza, Boris Staletic, Ethan Steinberg, Patrick Stewart, Ivor Wanders, and Xiaofei Wang.

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

Contributing


See the `contributing
guide <https://github.com/pybind/pybind11/blob/master/.github/CONTRIBUTING.md>`_
for information on building and contributing to pybind11.

License
~~~~~~~

pybind11 is provided under a BSD-style license that can be found in the
`LICENSE <https://github.com/pybind/pybind11/blob/master/LICENSE>`_
file. By using, distributing, or contributing to this project, you agree
to the terms and conditions of this 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/

pybind11 (pybind/pybind11)

header-only
Searching Database…

What is this?pybind11 is a lightweight header-only C++ library that exposes C++ types in Python and vice versa — mainly to create Python bindings for existing C++ code.
Is this a library I link against at runtime, or something else?It's header-only: your build just includes a few C++ headers, and there is no additional library to link against.
How do I add it to a C++ project?Include the headers and wire them into your build — the README links setuptools, scikit-build and CMake example setups, and the tutorial and reference docs live at pybind11.readthedocs.io.
What do I need installed before I can use it?Just a C++11-compatible compiler and a Python interpreter: the core is ~4K lines of headers depending only on Python (CPython 3.9+, PyPy, or GraalPy) and the C++ standard library — no Boost.
Will it work with my Python interpreter and version?CPython 3.9+, PyPy3 7.3.17+ and GraalPy 24.1+ are supported through one implementation-agnostic interface; older interpreters need older pybind11 releases.
Which platforms and compilers are actually tested?Continuous integration exercises a range of operating systems, Python versions, C++ standards and toolchains; closely related combos usually work too but are not promised.
What can I use it under?A permissive BSD-style license — the exact terms are in the LICENSE file in the repo.
How is it different from Boost.Python?It was created as a tiny self-contained alternative to Boost.Python that drops the enormous Boost dependency. It has since grown beyond it in many ways: binaries are generally at least 2x smaller — a PyRosetta conversion reported 5.4x smaller binaries and 5.8x faster compiles — and common bindings need much less code.
What C++ features can I map to Python?Functions and methods (instance, static, overloaded), custom types by value, reference or pointer, attributes, arbitrary exception types, enums, callbacks, iterators, custom operators, single and multiple inheritance, STL data structures, and smart pointers like std::shared_ptr.
How does it handle NumPy arrays?NumPy support is integrated: functions can be automatically vectorized to run over every entry of an array argument, and buffer protocols allow fast conversion between C++ matrix classes like Eigen and NumPy without expensive copies.
Can Python code subclass my C++ classes?Yes — C++ classes with virtual (and pure virtual) methods can be extended in Python.
Creator
pybind
Size
13.4 MB
Stars
18K
Age
11y
Commits · 90 Days