| .. highlight:: c | |
| .. _stable: | |
| *********************** | |
| C API and ABI Stability | |
| *********************** | |
| Unless documented otherwise, Python's C API is covered by the Backwards | |
| Compatibility Policy, :pep:`387`. | |
| Most changes to it are source-compatible (typically by only adding new API). | |
| Changing existing API or removing API is only done after a deprecation period | |
| or to fix serious issues. | |
| CPython's Application Binary Interface (ABI) is forward- and | |
| backwards-compatible across a minor release (if these are compiled the same | |
| way; see :ref:`stable-abi-platform` below). | |
| So, code compiled for Python 3.10.0 will work on 3.10.8 and vice versa, | |
| but will need to be compiled separately for 3.9.x and 3.11.x. | |
| There are two tiers of C API with different stability expectations: | |
| - :ref:`Unstable API <unstable-c-api>`, may change in minor versions without | |
| a deprecation period. It is marked by the ``PyUnstable`` prefix in names. | |
| - :ref:`Limited API <limited-c-api>`, is compatible across several minor releases. | |
| When :c:macro:`Py_LIMITED_API` is defined, only this subset is exposed | |
| from ``Python.h``. | |
| These are discussed in more detail below. | |
| Names prefixed by an underscore, such as ``_Py_InternalState``, | |
| are private API that can change without notice even in patch releases. | |
| If you need to use this API, consider reaching out to | |
| `CPython developers <https://discuss.python.org/c/core-dev/c-api/30>`_ | |
| to discuss adding public API for your use case. | |
| .. _unstable-c-api: | |
| Unstable C API | |
| ============== | |
| .. index:: single: PyUnstable | |
| Any API named with the ``PyUnstable`` prefix exposes CPython implementation | |
| details, and may change in every minor release (e.g. from 3.9 to 3.10) without | |
| any deprecation warnings. | |
| However, it will not change in a bugfix release (e.g. from 3.10.0 to 3.10.1). | |
| It is generally intended for specialized, low-level tools like debuggers. | |
| Projects that use this API are expected to follow | |
| CPython development and spend extra effort adjusting to changes. | |
| .. _stable-abi: | |
| .. _stable-application-binary-interface: | |
| Stable Application Binary Interfaces | |
| ==================================== | |
| Python's :dfn:`Stable ABI` allows extensions to be compatible with multiple | |
| versions of Python, without recompilation. | |
| .. note:: | |
| For simplicity, this document talks about *extensions*, but Stable ABI | |
| works the same way for all uses of the API – for example, embedding Python. | |
| There are two Stable ABIs: | |
| - ``abi3``, introduced in Python 3.2, is compatible with | |
| **non**-:term:`free-threaded <free-threaded build>` builds of CPython. | |
| - ``abi3t``, introduced in Python 3.15, is compatible with | |
| :term:`free-threaded <free-threaded build>` builds of CPython. | |
| It has stricter API limitations than ``abi3``. | |
| .. versionadded:: 3.15 | |
| ``abi3t`` was added in :pep:`803` | |
| It is possible for an extension to be compiled for *both* ``abi3`` and | |
| ``abi3t`` at the same time; the result will be compatible with | |
| both free-threaded and non-free-threaded builds of Python. | |
| Currently, this has no downsides compared to compiling for ``abi3t`` only. | |
| Each Stable ABI is versioned using the first two numbers of the Python version. | |
| For example, Stable ABI 3.14 corresponds to Python 3.14. | |
| An extension compiled for Stable ABI 3.x is ABI-compatible with Python 3.x | |
| and above. | |
| Extensions that target a stable ABI must only use a limited subset of | |
| the C API. This subset is known as the :dfn:`Limited API`; its contents | |
| are :ref:`listed below <limited-api-list>`. | |
| On Windows, extensions that use a Stable ABI should be linked against | |
| ``python3.dll`` rather than a version-specific library such as | |
| ``python39.dll``. | |
| This library only exposes the relevant symbols. | |
| On some platforms, Python will look for and load shared library files named | |
| with the ``abi3`` or ``abi3t`` tag (for example, ``mymodule.abi3.so``). | |
| :term:`Free-threaded <free-threaded build>` interpreters only recognize the | |
| ``abi3t`` tag, while non-free-threaded ones will prefer ``abi3`` but fall back | |
| to ``abi3t``. | |
| Thus, extensions compatible with both ABIs should use the ``abi3t`` tag. | |
| Python does not necessarily check that extensions it loads | |
| have compatible ABI. | |
| Extension authors are encouraged to add a check using the :c:macro:`Py_mod_abi` | |
| slot or the :c:func:`PyABIInfo_Check` function, but the user | |
| (or their packaging tool) is ultimately responsible for ensuring that, | |
| for example, extensions built for Stable ABI 3.10 are not installed for lower | |
| versions of Python. | |
| All functions in Stable ABI are present as functions in Python's shared | |
| library, not solely as macros. | |
| This makes them usable in languages that don't use the C | |
| preprocessor, including Python's :py:mod:`ctypes`. | |
| .. _abi3-compiling: | |
| Compiling for Stable ABI | |
| ------------------------ | |
| .. note:: | |
| Build tools (such as, for example, meson-python, scikit-build-core, | |
| or Setuptools) often have a mechanism for setting macros and synchronizing | |
| them with extension filenames and other metadata. | |
| Prefer using such a mechanism, if it exists, over defining the | |
| macros manually. | |
| The rest of this section is mainly relevant for tool authors, and for | |
| people who compile extensions manually. | |
| .. seealso:: `list of recommended tools`_ in the Python Packaging User Guide | |
| .. _list of recommended tools: https://packaging.python.org/en/latest/guides/tool-recommendations/#build-backends-for-extension-modules | |
| To compile for a Stable ABI, define one or both of the following macros | |
| to the lowest Python version your extension should support, in | |
| :c:macro:`Py_PACK_VERSION` format. | |
| Typically, you should choose a specific value rather than the version of | |
| the Python headers you are compiling against. | |
| The macros must be defined before including ``Python.h``. | |
| Since :c:macro:`Py_PACK_VERSION` is not available at this point, you | |
| will need to use the numeric value directly. | |
| For reference, the values for a few recent Python versions are: | |
| .. version-hex-cheatsheet:: | |
| When one of the macros is defined, ``Python.h`` will only expose API that is | |
| compatible with the given Stable ABI -- that is, the | |
| :ref:`Limited API <limited-api-list>` plus some definitions that need to be | |
| visible to the compiler but should not be used directly. | |
| When both are defined, ``Python.h`` will only expose API compatible with | |
| both Stable ABIs. | |
| .. c:macro:: Py_LIMITED_API | |
| Target ``abi3``, that is, | |
| non-:term:`free-threaded builds <free-threaded build>` of CPython. | |
| See :ref:`above <abi3-compiling>` for common information. | |
| .. c:macro:: Py_TARGET_ABI3T | |
| Target ``abi3t``, that is, | |
| :term:`free-threaded builds <free-threaded build>` of CPython. | |
| See :ref:`above <abi3-compiling>` for common information. | |
| .. versionadded:: 3.15 | |
| Both macros specify a target ABI; the different naming style is due to | |
| backwards compatibility. | |
| .. admonition:: Historical note | |
| You can also define ``Py_LIMITED_API`` as ``3``. This works the same as | |
| ``0x03020000`` (Python 3.2, the version that introduced Stable ABI). | |
| When both are defined, ``Python.h`` may, or may not, redefine | |
| :c:macro:`!Py_LIMITED_API` to match :c:macro:`!Py_TARGET_ABI3T`. | |
| On a :term:`free-threaded build` -- that is, when | |
| :c:macro:`Py_GIL_DISABLED` is defined -- :c:macro:`!Py_TARGET_ABI3T` | |
| defaults to the value of :c:macro:`!Py_LIMITED_API`. | |
| This means that there are two ways to build for both ``abi3`` and ``abi3t``: | |
| - define both :c:macro:`!Py_LIMITED_API` and :c:macro:`!Py_TARGET_ABI3T`, or | |
| - define only :c:macro:`!Py_LIMITED_API` and: | |
| - on Windows, define :c:macro:`!Py_GIL_DISABLED`; | |
| - on other systems, use the headers of free-threaded build of Python. | |
| .. _limited-api-scope-and-performance: | |
| Stable ABI Scope and Performance | |
| -------------------------------- | |
| The goal for Stable ABI is to allow everything that is possible with the | |
| full C API, but possibly with a performance penalty. | |
| Generally, compatibility with Stable ABI will require some changes to an | |
| extension's source code. | |
| For example, while :c:func:`PyList_GetItem` is available, its "unsafe" macro | |
| variant :c:func:`PyList_GET_ITEM` is not. | |
| The macro can be faster because it can rely on version-specific implementation | |
| details of the list object. | |
| For another example, when *not* compiling for Stable ABI, some C API | |
| functions are inlined or replaced by macros. | |
| Compiling for Stable ABI disables this inlining, allowing stability as | |
| Python's data structures are improved, but possibly reducing performance. | |
| By leaving out the :c:macro:`!Py_LIMITED_API` or :c:macro:`!Py_TARGET_ABI3T` | |
| definition, it is possible to compile Stable-ABI-compatible source | |
| for a version-specific ABI. | |
| A potentially faster version-specific extension can then be distributed | |
| alongside a version compiled for Stable ABI -- a slower but more compatible | |
| fallback. | |
| .. _limited-api-caveats: | |
| Stable ABI Caveats | |
| ------------------ | |
| Note that compiling for Stable ABI is *not* a complete guarantee that code will | |
| be compatible with the expected Python versions. | |
| Stable ABI prevents *ABI* issues, like linker errors due to missing | |
| symbols or data corruption due to changes in structure layouts or function | |
| signatures. | |
| However, other changes in Python can change the *behavior* of extensions. | |
| One issue that the :c:macro:`Py_TARGET_ABI3T` and :c:macro:`Py_LIMITED_API` | |
| macros do not guard against is calling a function with arguments that are | |
| invalid in a lower Python version. | |
| For example, consider a function that starts accepting ``NULL`` for an | |
| argument. In Python 3.9, ``NULL`` now selects a default behavior, but in | |
| Python 3.8, the argument will be used directly, causing a ``NULL`` dereference | |
| and crash. A similar argument works for fields of structs. | |
| For these reasons, we recommend testing an extension with *all* minor Python | |
| versions it supports. | |
| We also recommend reviewing documentation of all used API to check | |
| if it is explicitly part of the Limited API. Even with ``Py_LIMITED_API`` | |
| defined, a few private declarations are exposed for technical reasons (or | |
| even unintentionally, as bugs). | |
| Also note that while compiling with ``Py_LIMITED_API`` 3.8 means that the | |
| extension should *load* on Python 3.12, and *compile* with Python 3.12, | |
| the same source will not necessarily compile with ``Py_LIMITED_API`` | |
| set to 3.12. | |
| In general, parts of the Limited API may be deprecated and removed, | |
| provided that Stable ABI stays stable. | |
| .. _stable-abi-platform: | |
| Platform Considerations | |
| ======================= | |
| ABI stability depends not only on Python, but also on the compiler used, | |
| lower-level libraries and compiler options. For the purposes of | |
| the :ref:`Stable ABIs <stable-abi>`, these details define a “platform”. They | |
| usually depend on the OS type and processor architecture | |
| It is the responsibility of each particular distributor of Python | |
| to ensure that all Python versions on a particular platform are built | |
| in a way that does not break the Stable ABIs, or the version-specific ABIs. | |
| This is the case with Windows and macOS releases from ``python.org`` and many | |
| third-party distributors. | |
| ABI Checking | |
| ============ | |
| .. versionadded:: 3.15 | |
| Python includes a rudimentary check for ABI compatibility. | |
| This check is not comprehensive. | |
| It only guards against common cases of incompatible modules being | |
| installed for the wrong interpreter. | |
| It also does not take :ref:`platform incompatibilities <stable-abi-platform>` | |
| into account. | |
| It can only be done after an extension is successfully loaded. | |
| Despite these limitations, it is recommended that extension modules use this | |
| mechanism, so that detectable incompatibilities raise exceptions rather than | |
| crash. | |
| Most modules can use this check via the :c:data:`Py_mod_abi` | |
| slot and the :c:macro:`PyABIInfo_VAR` macro, for example like this: | |
| .. code-block:: c | |
| PyABIInfo_VAR(abi_info); | |
| static PyModuleDef_Slot mymodule_slots[] = { | |
| {Py_mod_abi, &abi_info}, | |
| ... | |
| }; | |
| The full API is described below for advanced use cases. | |
| .. c:function:: int PyABIInfo_Check(PyABIInfo *info, const char *module_name) | |
| Verify that the given *info* is compatible with the currently running | |
| interpreter. | |
| Return 0 on success. On failure, raise an exception and return -1. | |
| If the ABI is incompatible, the raised exception will be :py:exc:`ImportError`. | |
| The *module_name* argument can be ``NULL``, or point to a NUL-terminated | |
| UTF-8-encoded string used for error messages. | |
| Note that if *info* describes the ABI that the current code uses (as defined | |
| by :c:macro:`PyABIInfo_VAR`, for example), using any other Python C API | |
| may lead to crashes. | |
| In particular, it is not safe to examine the raised exception. | |
| .. versionadded:: 3.15 | |
| .. c:macro:: PyABIInfo_VAR(NAME) | |
| Define a static :c:struct:`PyABIInfo` variable with the given *NAME* that | |
| describes the ABI that the current code will use. | |
| This macro expands to: | |
| .. code-block:: c | |
| static PyABIInfo NAME = { | |
| 1, 0, | |
| PyABIInfo_DEFAULT_FLAGS, | |
| PY_VERSION_HEX, | |
| PyABIInfo_DEFAULT_ABI_VERSION | |
| } | |
| .. versionadded:: 3.15 | |
| .. c:type:: PyABIInfo | |
| .. c:member:: uint8_t abiinfo_major_version | |
| The major version of :c:struct:`PyABIInfo`. Can be set to: | |
| * ``0`` to skip all checking, or | |
| * ``1`` to specify this version of :c:struct:`!PyABIInfo`. | |
| .. c:member:: uint8_t abiinfo_minor_version | |
| The minor version of :c:struct:`PyABIInfo`. | |
| Must be set to ``0``; larger values are reserved for backwards-compatible | |
| future versions of :c:struct:`!PyABIInfo`. | |
| .. c:member:: uint16_t flags | |
| .. c:namespace:: NULL | |
| This field is usually set to the following macro: | |
| .. c:macro:: PyABIInfo_DEFAULT_FLAGS | |
| Default flags, based on current values of macros such as | |
| :c:macro:`Py_LIMITED_API` and :c:macro:`Py_GIL_DISABLED`. | |
| Alternately, the field can be set to the following flags, combined | |
| by bitwise OR. | |
| Unused bits must be set to zero. | |
| ABI variant -- one of: | |
| .. c:macro:: PyABIInfo_STABLE | |
| Specifies that Stable ABI is used. | |
| .. c:macro:: PyABIInfo_INTERNAL | |
| Specifies ABI specific to a particular build of CPython. | |
| Internal use only. | |
| Free-threading compatibility -- one of: | |
| .. c:macro:: PyABIInfo_FREETHREADED | |
| Specifies ABI compatible with :term:`free-threaded builds | |
| <free-threaded build>` of CPython. | |
| (That is, ones compiled with :option:`--disable-gil`; with ``t`` | |
| in :py:data:`sys.abiflags`) | |
| .. c:macro:: PyABIInfo_GIL | |
| Specifies ABI compatible with non-free-threaded builds of CPython | |
| (ones compiled *without* :option:`--disable-gil`). | |
| .. c:macro:: PyABIInfo_FREETHREADING_AGNOSTIC | |
| Specifies ABI compatible with both free-threaded and | |
| non-free-threaded builds of CPython, that is, both | |
| ``abi3`` and ``abi3t``. | |
| .. c:member:: uint32_t build_version | |
| The version of the Python headers used to build the code, in the format | |
| used by :c:macro:`PY_VERSION_HEX`. | |
| This can be set to ``0`` to skip any checks related to this field. | |
| This option is meant mainly for projects that do not use the CPython | |
| headers directly, and do not emulate a specific version of them. | |
| .. c:member:: uint32_t abi_version | |
| The ABI version. | |
| For Stable ABI, this field should be the value of | |
| :c:macro:`Py_LIMITED_API` or :c:macro:`Py_TARGET_ABI3T`. | |
| If both are defined, use the smaller value. | |
| (If :c:macro:`Py_LIMITED_API` is ``3``; use | |
| :c:expr:`Py_PACK_VERSION(3, 2)` instead of ``3``.) | |
| Otherwise, it should be set to :c:macro:`PY_VERSION_HEX`. | |
| It can also be set to ``0`` to skip any checks related to this field. | |
| .. c:namespace:: NULL | |
| .. c:macro:: PyABIInfo_DEFAULT_ABI_VERSION | |
| The value that should be used for this field, based on current | |
| values of macros such as :c:macro:`Py_LIMITED_API`, | |
| :c:macro:`PY_VERSION_HEX` and :c:macro:`Py_GIL_DISABLED`. | |
| .. versionadded:: 3.15 | |
| .. _limited-c-api: | |
| .. _limited-api-list: | |
| Contents of Limited API | |
| ======================= | |
| This is the definitive list of :ref:`Limited API <limited-c-api>` for | |
| Python |version|: | |
| .. limited-api-list:: |