Совместимость 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