.. 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-application-binary-interface:

Stable Application Binary Interface
===================================

For simplicity, this document talks about *extensions*, but the Limited API
and Stable ABI work the same way for all uses of the API – for example,
embedding Python.

.. _limited-c-api:

Limited C API
-------------

Python 3.2 introduced the *Limited API*, a subset of Python's C API.
Extensions that only use the Limited API can be
compiled once and be loaded on multiple versions of Python.
Contents of the Limited API are :ref:`listed below <limited-api-list>`.

.. c:macro:: Py_LIMITED_API

   Define this macro before including ``Python.h`` to opt in to only use
   the Limited API, and to select the Limited API version.

   Define ``Py_LIMITED_API`` to the value of :c:macro:`PY_VERSION_HEX`
   corresponding to the lowest Python version your extension supports.
   The extension will be ABI-compatible with all Python 3 releases
   from the specified one onward, and can use Limited API introduced up to that
   version.

   Rather than using the ``PY_VERSION_HEX`` macro directly, hardcode a minimum
   minor version (e.g. ``0x030A0000`` for Python 3.10) for stability when
   compiling with future Python versions.

   You can also define ``Py_LIMITED_API`` to ``3``. This works the same as
   ``0x03020000`` (Python 3.2, the version that introduced Limited API).

.. c:macro:: Py_TARGET_ABI3T

   Define this macro before including ``Python.h`` to opt in to only use
   the Limited API for :term:`free-threaded builds <free-threaded build>`,
   and to select the Limited API version.

   .. seealso:: :pep:`803`

   .. versionadded:: 3.15


.. _stable-abi:

Stable ABI
----------

To enable this, Python provides a *Stable ABI*: a set of symbols that will
remain ABI-compatible across Python 3.x versions.

.. note::

   The 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.
   See Python's Backwards Compatibility Policy (:pep:`387`) for details.

The Stable ABI contains symbols exposed in the :ref:`Limited API
<limited-c-api>`, but also other ones – for example, functions necessary to
support older versions of the Limited API.

On Windows, extensions that use the Stable ABI should be linked against
``python3.dll`` rather than a version-specific library such as
``python39.dll``.

On some platforms, Python will look for and load shared library files named
with the ``abi3`` tag (e.g. ``mymodule.abi3.so``).
It does not check if such extensions conform to a Stable ABI.
The user (or their packaging tools) need to ensure that, for example,
extensions built with the 3.10+ Limited API are not installed for lower
versions of Python.

All functions in the Stable ABI are present as functions in Python's shared
library, not solely as macros. This makes them usable from languages that don't
use the C preprocessor.


Limited API Scope and Performance
---------------------------------

The goal for the Limited API is to allow everything that is possible with the
full C API, but possibly with a performance penalty.

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.

Without ``Py_LIMITED_API`` defined, some C API functions are inlined or
replaced by macros.
Defining ``Py_LIMITED_API`` disables this inlining, allowing stability as
Python's data structures are improved, but possibly reducing performance.

By leaving out the ``Py_LIMITED_API`` definition, it is possible to compile
a Limited API extension with a version-specific ABI. This can improve
performance for that Python version, but will limit compatibility.
Compiling with ``Py_LIMITED_API`` will then yield an extension that can be
distributed where a version-specific one is not available – for example,
for prereleases of an upcoming Python version.


Limited API Caveats
-------------------

Note that compiling with ``Py_LIMITED_API`` is *not* a complete guarantee that
code conforms to the :ref:`Limited API <limited-c-api>` or the :ref:`Stable ABI
<stable-abi>`. ``Py_LIMITED_API`` only covers definitions, but an API also
includes other issues, such as expected semantics.

One issue that ``Py_LIMITED_API`` does 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.

Another issue is that some struct fields are currently not hidden when
``Py_LIMITED_API`` is defined, even though they're part of the Limited API.

For these reasons, we recommend testing an extension with *all* minor Python
versions it supports, and preferably to build with the *lowest* such version.

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 the Limited API is not necessarily stable: compiling with
``Py_LIMITED_API`` with Python 3.8 means that the extension will
run with Python 3.12, but it will not necessarily *compile* with Python 3.12.
In particular, parts of the Limited API may be deprecated and removed,
provided that the 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 ABI <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 ABI.
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 the 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 free-threading builds 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-threading builds of CPython
            (ones compiled *without* :option:`--disable-gil`).

   .. 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 the Stable ABI, this field should be the value of
      :c:macro:`Py_LIMITED_API`
      (except if :c:macro:`Py_LIMITED_API` is ``3``; use
      :c:expr:`Py_PACK_VERSION(3, 2)` in that case).

      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-api-list:

Contents of Limited API
=======================


Currently, the :ref:`Limited API <limited-c-api>` includes the following items:

.. limited-api-list::
