Stéphane Wirtel | cbb6484 | 2019-05-17 11:55:34 +0200 | [diff] [blame] | 1 | .. highlight:: c |
Martin v. Löwis | c06917b | 2012-06-22 12:49:08 +0200 | [diff] [blame] | 2 | |
| 3 | .. _stable: |
| 4 | |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 5 | *************** |
| 6 | C API Stability |
| 7 | *************** |
| 8 | |
| 9 | Python's C API is covered by the Backwards Compatibility Policy, :pep:`387`. |
| 10 | While the C API will change with every minor release (e.g. from 3.9 to 3.10), |
| 11 | most changes will be source-compatible, typically by only adding new API. |
| 12 | Changing existing API or removing API is only done after a deprecation period |
| 13 | or to fix serious issues. |
| 14 | |
| 15 | CPython's Application Binary Interface (ABI) is forward- and |
| 16 | backwards-compatible across a minor release (if these are compiled the same |
| 17 | way; see :ref:`stable-abi-platform` below). |
| 18 | So, code compiled for Python 3.10.0 will work on 3.10.8 and vice versa, |
| 19 | but will need to be compiled separately for 3.9.x and 3.10.x. |
| 20 | |
| 21 | Names prefixed by an underscore, such as ``_Py_InternalState``, |
| 22 | are private API that can change without notice even in patch releases. |
| 23 | |
| 24 | |
Nick Coghlan | 7d82c86 | 2013-03-07 23:14:44 +1000 | [diff] [blame] | 25 | Stable Application Binary Interface |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 26 | =================================== |
Martin v. Löwis | c06917b | 2012-06-22 12:49:08 +0200 | [diff] [blame] | 27 | |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 28 | Python 3.2 introduced the *Limited API*, a subset of Python's C API. |
| 29 | Extensions that only use the Limited API can be |
| 30 | compiled once and work with multiple versions of Python. |
| 31 | Contents of the Limited API are :ref:`listed below <stable-abi-list>`. |
Martin v. Löwis | c06917b | 2012-06-22 12:49:08 +0200 | [diff] [blame] | 32 | |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 33 | To enable this, Python provides a *Stable ABI*: a set of symbols that will |
| 34 | remain compatible across Python 3.x versions. The Stable ABI contains symbols |
| 35 | exposed in the Limited API, but also other ones – for example, functions |
| 36 | necessary to support older versions of the Limited API. |
Martin v. Löwis | c06917b | 2012-06-22 12:49:08 +0200 | [diff] [blame] | 37 | |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 38 | (For simplicity, this document talks about *extensions*, but the Limited API |
| 39 | and Stable ABI work the same way for all uses of the API – for example, |
| 40 | embedding Python.) |
Nick Coghlan | 7d82c86 | 2013-03-07 23:14:44 +1000 | [diff] [blame] | 41 | |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 42 | .. c:macro:: Py_LIMITED_API |
Martin v. Löwis | c06917b | 2012-06-22 12:49:08 +0200 | [diff] [blame] | 43 | |
Miss Islington (bot) | 5abc681 | 2021-05-14 05:28:08 -0700 | [diff] [blame] | 44 | Define this macro before including ``Python.h`` to opt in to only use |
| 45 | the Limited API, and to select the Limited API version. |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 46 | |
Miss Islington (bot) | 5abc681 | 2021-05-14 05:28:08 -0700 | [diff] [blame] | 47 | Define ``Py_LIMITED_API`` to the value of :c:data:`PY_VERSION_HEX` |
| 48 | corresponding to the lowest Python version your extension supports. |
| 49 | The extension will work without recompilation with all Python 3 releases |
| 50 | from the specified one onward, and can use Limited API introduced up to that |
| 51 | version. |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 52 | |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 53 | Rather than using the ``PY_VERSION_HEX`` macro directly, hardcode a minimum |
| 54 | minor version (e.g. ``0x030A0000`` for Python 3.10) for stability when |
| 55 | compiling with future Python versions. |
| 56 | |
Miss Islington (bot) | 5abc681 | 2021-05-14 05:28:08 -0700 | [diff] [blame] | 57 | You can also define ``Py_LIMITED_API`` to ``3``. This works the same as |
| 58 | ``0x03020000`` (Python 3.2, the version that introduced Limited API). |
| 59 | |
Miss Islington (bot) | 3739371 | 2021-05-13 22:29:09 -0700 | [diff] [blame] | 60 | On Windows, extensions that use the Stable ABI should be linked against |
| 61 | ``python3.dll`` rather than a version-specific library such as |
| 62 | ``python39.dll``. |
| 63 | |
| 64 | On some platforms, Python will look for and load shared library files named |
| 65 | with the ``abi3`` tag (e.g. ``mymodule.abi3.so``). |
| 66 | It does not check if such extensions conform to a Stable ABI. |
| 67 | The user (or their packaging tools) need to ensure that, for example, |
| 68 | extensions built with the 3.10+ Limited API are not installed for lower |
| 69 | versions of Python. |
| 70 | |
| 71 | All functions in the Stable ABI are present as functions in Python's shared |
| 72 | library, not solely as macros. This makes them usable from languages that don't |
| 73 | use the C preprocessor. |
| 74 | |
| 75 | |
| 76 | Limited API Scope and Performance |
| 77 | --------------------------------- |
| 78 | |
| 79 | The goal for the Limited API is to allow everything that is possible with the |
| 80 | full C API, but possibly with a performance penalty. |
| 81 | |
| 82 | For example, while :c:func:`PyList_GetItem` is available, its “unsafe” macro |
| 83 | variant :c:func:`PyList_GET_ITEM` is not. |
| 84 | The macro can be faster because it can rely on version-specific implementation |
| 85 | details of the list object. |
| 86 | |
| 87 | Without ``Py_LIMITED_API`` defined, some C API functions are inlined or |
| 88 | replaced by macros. |
| 89 | Defining ``Py_LIMITED_API`` disables this inlining, allowing stability as |
| 90 | Python's data structures are improved, but possibly reducing performance. |
| 91 | |
| 92 | By leaving out the ``Py_LIMITED_API`` definition, it is possible to compile |
| 93 | a Limited API extension with a version-specific ABI. This can improve |
| 94 | performance for that Python version, but will limit compatibility. |
| 95 | Compiling with ``Py_LIMITED_API`` will then yield an extension that can be |
| 96 | distributed where a version-specific one is not available – for example, |
| 97 | for prereleases of an upcoming Python version. |
| 98 | |
| 99 | |
| 100 | Limited API Caveats |
| 101 | ------------------- |
| 102 | |
| 103 | Note that compiling with ``Py_LIMITED_API`` is *not* a complete guarantee that |
| 104 | code conforms to the Limited API or the Stable ABI. ``Py_LIMITED_API`` only |
| 105 | covers definitions, but an API also includes other issues, such as expected |
| 106 | semantics. |
| 107 | |
| 108 | One issue that ``Py_LIMITED_API`` does not guard against is calling a function |
| 109 | with arguments that are invalid in a lower Python version. |
| 110 | For example, consider a function that starts accepting ``NULL`` for an |
| 111 | argument. In Python 3.9, ``NULL`` now selects a default behavior, but in |
| 112 | Python 3.8, the argument will be used directly, causing a ``NULL`` dereference |
| 113 | and crash. A similar argument works for fields of structs. |
| 114 | |
| 115 | Another issue is that some struct fields are currently not hidden when |
| 116 | ``Py_LIMITED_API`` is defined, even though they're part of the Limited API. |
| 117 | |
| 118 | For these reasons, we recommend testing an extension with *all* minor Python |
| 119 | versions it supports, and preferably to build with the *lowest* such version. |
| 120 | |
| 121 | We also recommend reviewing documentation of all used API to check |
| 122 | if it is explicitly part of the Limited API. Even with ``Py_LIMITED_API`` |
| 123 | defined, a few private declarations are exposed for technical reasons (or |
| 124 | even unintentionally, as bugs). |
| 125 | |
| 126 | Also note that the Limited API is not necessarily stable: compiling with |
| 127 | ``Py_LIMITED_API`` with Python 3.8 means that the extension will |
| 128 | run with Python 3.12, but it will not necessarily *compile* with Python 3.12. |
| 129 | In particular, parts of the Limited API may be deprecated and removed, |
| 130 | provided that the Stable ABI stays stable. |
| 131 | |
| 132 | |
| 133 | .. _stable-abi-platform: |
| 134 | |
| 135 | Platform Considerations |
| 136 | ======================= |
| 137 | |
| 138 | ABI stability depends not only on Python, but also on the compiler used, |
| 139 | lower-level libraries and compiler options. For the purposes of the Stable ABI, |
| 140 | these details define a “platform”. They usually depend on the OS |
| 141 | type and processor architecture |
| 142 | |
| 143 | It is the responsibility of each particular distributor of Python |
| 144 | to ensure that all Python versions on a particular platform are built |
| 145 | in a way that does not break the Stable ABI. |
| 146 | This is the case with Windows and macOS releases from ``python.org`` and many |
| 147 | third-party distributors. |
| 148 | |
| 149 | |
| 150 | .. _stable-abi-list: |
| 151 | |
| 152 | Contents of Limited API |
| 153 | ======================= |
| 154 | |
| 155 | |
| 156 | Currently, the Limited API includes the following items: |
| 157 | |
| 158 | .. limited-api-list:: |