稳定的应用程序二进制接口

传统上,Python 的 C API 会在每个发行版中更改。大多数更改都是与源兼容的,通常只需添加 API,而不是更改现有 API 或删除 API(尽管某些接口在先被弃用后确实会删除)。

不幸的是,API 兼容性并没有扩展到二进制兼容性(ABI)。原因主要是结构定义的演变,其中添加新字段或更改字段类型可能不会破坏 API,但会破坏 ABI。因此,需要为每个 Python 版本重新编译扩展模块(尽管在不使用任何受影响的接口的情况下,在 Unix 上可能会发生异常)。此外,在 Windows 上,扩展模块与特定的 pythonXY.dll 链接,并且需要重新编译以与较新的模块链接。

从 Python 3.2 开始,已语句 API 的子集以确保稳定的 ABI。希望使用此 API 的扩展模块(称为“受限 API”)需要定义Py_LIMITED_API。扩展模块中隐藏了许多解释器详细信息;作为回报,构建了一个模块,该模块可在任何 3.x 版本(x> = 2)上运行而无需重新编译。

在某些情况下,需要使用新Function扩展稳定的 ABI。希望使用这些新 API 的扩展模块需要将Py_LIMITED_API设置为其要支持的最低 Python 版本的PY_VERSION_HEX值(请参见API 和 ABI 版本控制)(例如,对于 Python 3.3 来说为0x03030000)。这样的模块将在所有后续的 Python 发行版上运行,但由于较早的发行版无法加载(由于缺少符号)。

从 Python 3.2 开始,在 PEP 384中记录了受限 API 可用的Function集。在 C API 文档中,不属于受限 API 的 API 元素被标记为“不属于受限 API”。