稳定的应用程序二进制接口 — Python 文档

来自菜鸟教程
Python/docs/3.8/c-api/stable
跳转至:导航、​搜索

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

传统上,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) 上运行的模块。

在某些情况下,需要使用新功能扩展稳定的 ABI。 希望使用这些新 API 的扩展模块需要将 Py_LIMITED_API 设置为他们想要支持的最低 Python 版本(例如 0x03030000 用于 Python 3.3)。 此类模块将适用于所有后续 Python 版本,但无法在旧版本上加载(由于缺少符号)。

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