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

传统上,Python的C API会随着每个版本的变化而变化。大多数更改都是源代码兼容的,通常只通过添加API,而不是更改现有的API或删除API(尽管有些接口在第一次被否决后确实会被删除)。

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

自Python3.2以来,已经声明了API的一个子集,以保证稳定的ABI。希望使用此API(称为“受限API”)的扩展模块需要定义 Py_LIMITED_API . 许多解释器细节随后从扩展模块中隐藏起来;作为回报,一个模块被构建成可以在任何3.x版本(x>=2)上工作,而不需要重新编译。

在某些情况下,需要用新的函数扩展稳定的ABI。希望使用这些新API的扩展模块需要设置 Py_LIMITED_APIPY_VERSION_HEX 值(参见 API和ABI版本控制 )他们希望支持的最低python版本(例如 0x03030000 对于python 3.3)。这些模块将在所有后续的Python版本上工作,但无法在旧版本上加载(因为缺少符号)。

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