Совместимость C-модулей с разными версиями Python

Для Python можно писать расширения (модули) в виде бинарной библиотеки с C-интерфейсом.

Модуль в виде исходников

Модуль загружается на pypi в виде исходников и python сам компилирует его при установке на целевую машину.

Это позволяет компилировать модуль оптимальным образом под целевой компьютер и версию python. С другой стороны это накладывает ограничения на ползователя в виде необходимости иметь на своей машине нужный компилятор, заголовочные файлы Python и тех зависимостей, которые нужны для работы расширения. Это относительно легко обеспечивается для Linux, но сложно для Windows - тут у конечных пользователей обычно нет ни компилятора ни заголовочных файлов библиотек.

Этот вариант может комбинироваться с поставкой бинарных сборок. Тогда pip при установке сначала проверит наличие подходящей бинарной версии и если она есть - возьмёт бинарную версию. А если её нет - будет компилировать модуль из исходников.

Это менее удобно, но оставляет возможность использовать модуль на платформах, под которые разработчик не сделал бинарной сборки.

Сборка под каждую версию python

Тут всё очевидно - модуль расширения компилируется для каждой комбинации поддерживаемой платформы и версии Python.
Модуль, скомпилированный для старой версии Python не будет работать с новой версией.

Помимо большого количества бинарников для компиляции это означает что когда разработчик прекратит поддержку модуля пользоваться им на новых версиях Python будет затруднительно.

Использование Stable ABI

Начиная с Python 3.2 вводится понятие Stable ABI (стабильный бинарный интерфейс) PEP-384. В этом варианте скрывается большинство деталей структуры, а макросы для обращения к полям структуры заменяются на вызовы функций.

Это с одной стороны увеличивает накладные расходы на общение к Python-API, с другой позволяет собрать бинарник только для самой старой поддерживаемой версии Python под каждую платформу и не пересобирать его при выходе новых версий Python.

Его использование включается макросами Py_LIMITED_API и PYTHON_API_VERSION (задаёт версию python-api)

Разница между Stable ABI и Limited API

Понятия Stable ABI и Limited API различаются, хотя и связаны друг с другом.

Stable ABI - гарантии бинарной совместимости интерфейса для более свежих версий Python на той же платформе в рамках одной мажорной версии. При этом в Stable ABI не входит сама бинарная спецификация - она определяется компилятором. Т.е. совместимость сохраняется при переходе от Python 3.9 на Python 3.10 или Python 3.12 на Linux. Но ABI будет отличаться между Python 3.9 и Python 4.0 или Python на Windows и Linux.

Limited API - это подмножество Python API для которого гарантируется стабильность бинарного интерфейса.

Более подробно об этом говорится в PEP-652