* feat!: drop support for Python 3.8 The minimum supported version is now Python 3.9. pybind11 v3.0 was the last release that supports Python 3.8. The deprecation note said that support goes away in 3.1. Remove the code paths that this makes dead: - the `_PyObject_Vectorcall` fallback in `cast.h` - the `frame->f_code` and `frame->f_back` fallbacks in `pytypes.h` - the `PyFrame_FastToLocals` path in `get_type_override` - the conditional `Py_VISIT(Py_TYPE(self))` in `tp_traverse` - `PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX`, the pre-PyConfig interpreter init, and the `widen_chars` helpers in `embed.h` Assisted-by: ClaudeCode:claude-opus-5 * ci(appveyor): use Python 3.9 The AppVeyor job set `PYTHON: 38`, which makes the path `C:\Python38`. The image gives Python 3.9.13 as `C:\Python39`. Assisted-by: ClaudeCode:claude-opus-5 * feat!: require MSVC 2019 or newer Python 3.9 is the new minimum, so MSVC 2017 is no longer needed. Raise the compile-time floor to _MSC_VER 1920 and remove the workarounds that only applied below it: std::launder, fold expressions, weak_from_this, aligned new/delete, the C4100 warning helper, and the func_handle syntax error. AppVeyor now builds with Visual Studio 2019. Assisted-by: ClaudeCode:claude-opus-5 * fix(appveyor): build against the Python that has the test packages CMake 4 has no FindPythonLibs, so pybind11 uses FindPython. FindPython reads the registry before PATH and selected `C:\Python314-x64`, but the test packages go into the Python on PATH. Pass `Python_ROOT_DIR` to name the correct one. Also set `CMAKE_ARCH`. It was never set, so the architecture came from the generator. Visual Studio 2017 defaults to Win32, but Visual Studio 2019 defaults to x64, which made this x86 job build 64-bit code. Assisted-by: ClaudeCode:claude-opus-5 * fix(appveyor): give the linker Python's libs directory The build compiled but failed to link with LNK1104 on a bare `python39.lib`. That name comes from the `#pragma comment(lib, ...)` in pyconfig.h, so the linker needs the directory. CMake 4 has no FindPythonLibs, and FindPython does not add it for this Debug x86 build. Put it on LIB instead. The directory listing is temporary, to confirm the library is present. Assisted-by: ClaudeCode:claude-opus-5 * fix(appveyor): link the release Python library in Debug The image ships python39_d.lib next to python39.lib, so FindPython picks the debug import library for a Debug build. pybind11 undefines _DEBUG around Python.h, so pyconfig.h asks for python39.lib instead and the link failed with LNK1104. Name the release library for the debug slot. Setting LIB does not work, because MSBuild replaces it from the toolset, and it would link both import libraries. Assisted-by: ClaudeCode:claude-opus-5 * chore(appveyor): print link settings to debug LNK1104 Revert the two attempted fixes. Neither changed the failure: setting LIB does not survive MSBuild, and naming the release library for Python_LIBRARY_DEBUG had no effect. Print the Python cache entries and the link settings of a generated project file instead, to see what the linker really gets. Temporary. Assisted-by: ClaudeCode:claude-opus-5 * fix(appveyor): take the release Python library in Debug The generated project file linked C:\Python39\libs\python39_d.lib in the Debug configuration, because the image ships debug binaries next to the release ones. pybind11 undefines _DEBUG around Python.h, so pyconfig.h asks for python39.lib in a #pragma comment(lib), which nothing on the link line satisfies and no library directory holds. Map Debug to the release artifacts. Assisted-by: ClaudeCode:claude-opus-5 * chore(appveyor): drop the temporary link diagnostic Assisted-by: ClaudeCode:claude-opus-5 * fix(tests): guard the unraisable warning filter for pytest < 6 The distro pytest in the Clang and GCC Docker jobs has no PytestUnraisableExceptionWarning, so an unconditional filterwarnings mark makes pytest fail with an INTERNALERROR after the tests pass. Assisted-by: ClaudeCode:claude-opus-5 Claude-Session: https://claude.ai/code/session_01Aimf6HuSz1vLRwBnbxmCTc * docs: address review items on version hints, embed docs, and a PyPy xfail Extend Python_ADDITIONAL_VERSIONS through 3.15, describe the PyConfig behavior of initialize_interpreter, and drop the stale Python 3.8 wording from the PyPy xfail reason. Assisted-by: ClaudeCode:claude-opus-5 * Update README.rst Co-authored-by: Ralf W. Grosse-Kunstleve <rwgkio@gmail.com> --------- Co-authored-by: Ralf W. Grosse-Kunstleve <rwgkio@gmail.com>
216 lines
8.5 KiB
ReStructuredText
216 lines
8.5 KiB
ReStructuredText
.. 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:
|
||
|
||
- Functions accepting and returning custom data structures per value,
|
||
reference, or pointer
|
||
- Instance methods and static methods
|
||
- Overloaded functions
|
||
- Instance attributes and static attributes
|
||
- Arbitrary exception types
|
||
- Enumerations
|
||
- Callbacks
|
||
- Iterators and ranges
|
||
- Custom operators
|
||
- Single and multiple inheritance
|
||
- STL data structures
|
||
- Smart pointers with reference counting like ``std::shared_ptr``
|
||
- Internal references with correct reference counting
|
||
- C++ classes with virtual (and pure virtual) methods can be extended
|
||
in Python
|
||
- Integrated NumPy support (NumPy 2 requires pybind11 2.12+)
|
||
|
||
Goodies
|
||
-------
|
||
|
||
In addition to the core functionality, pybind11 provides some extra
|
||
goodies:
|
||
|
||
- CPython 3.9+, PyPy3 7.3.17+, and GraalPy 24.1+ are supported with an
|
||
implementation-agnostic interface (see older versions for older CPython
|
||
and PyPy versions).
|
||
|
||
- It is possible to bind C++11 lambda functions with captured
|
||
variables. The lambda capture data is stored inside the resulting
|
||
Python function object.
|
||
|
||
- pybind11 uses C++11 move constructors and move assignment operators
|
||
whenever possible to efficiently transfer custom data types.
|
||
|
||
- It's easy to expose the internal storage of custom data types through
|
||
Pythons' buffer protocols. This is handy e.g. for fast conversion
|
||
between C++ matrix classes like Eigen and NumPy without expensive
|
||
copy operations.
|
||
|
||
- pybind11 can automatically vectorize functions so that they are
|
||
transparently applied to all entries of one or more NumPy array
|
||
arguments.
|
||
|
||
- Python's slice-based access and assignment operations can be
|
||
supported with just a few lines of code.
|
||
|
||
- Everything is contained in just a few header files; there is no need
|
||
to link against any additional libraries.
|
||
|
||
- Binaries are generally smaller by a factor of at least 2 compared to
|
||
equivalent bindings generated by Boost.Python. A recent pybind11
|
||
conversion of PyRosetta, an enormous Boost.Python binding project,
|
||
`reported <https://graylab.jhu.edu/Sergey/2016.RosettaCon/PyRosetta-4.pdf>`_
|
||
a binary size reduction of **5.4x** and compile time reduction by
|
||
**5.8x**.
|
||
|
||
- Function signatures are precomputed at compile time (using
|
||
``constexpr``), leading to smaller binaries.
|
||
|
||
- With little extra effort, C++ types can be pickled and unpickled
|
||
similar to regular Python objects.
|
||
|
||
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/
|