Stable Application Binary Interface¶
传统上,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版本的PY_VERSION_HEX
值(请参阅API and ABI Versioning想支持(例如0x03030000
for Python 3.3)。这些模块将在所有后续的Python版本上工作,但是在旧版本中无法加载(因为缺少符号)。
从Python 3.2开始,受限API中可用的函数集记录在 PEP 384中。在C API文档中,不属于受限API的API元素将标记为“不是受限API的一部分”。