穩(wěn)定的應(yīng)用程序二進(jìn)制接口?
傳統(tǒng)上,Python的C API將隨每個(gè)版本而變化。大多數(shù)更改都與源代碼兼容,通常只添加API,而不是更改現(xiàn)有API或刪除API(盡管某些接口會(huì)首先棄用然后再刪除)。
不幸的是,API兼容性沒(méi)有擴(kuò)展到二進(jìn)制兼容性(ABI)。原因主要是結(jié)構(gòu)定義的演變,在這里添加新字段或更改字段類型可能不會(huì)破壞API,但可能會(huì)破壞ABI。因此,每個(gè)Python版本都需要重新編譯擴(kuò)展模塊(即使在未使用任何受影響的接口的情況下,Unix上也可能會(huì)出現(xiàn)異常)。此外,在Windows上,擴(kuò)展模塊與特定的pythonXY.dll鏈接,需要重新編譯才能與新的pythonXY.dll鏈接。
從Python3.2起,已經(jīng)聲明了一個(gè)API的子集,以確保穩(wěn)定的ABI。如果使用此API(也被稱為“受限API”)的擴(kuò)展模塊需要定義``Py_LIMITED_API``。許多解釋器細(xì)節(jié)將從擴(kuò)展模塊中隱藏; 反過(guò)來(lái),在任何3.x版本(x>=2)上構(gòu)建的模塊都不需要重新編譯
在某些情況下,需要添加新函數(shù)來(lái)擴(kuò)展穩(wěn)定版 ABI。希望使用這些新 API 的擴(kuò)展模塊需要將 Py_LIMITED_API 設(shè)置為他們想要支持的最低 Python 版本的 PY_VERSION_HEX 值(例如: Python 3.3 為 0x03030000)(參見(jiàn) API 和 ABI 版本管理)。此類模塊將適用于所有后續(xù) Python版本,但無(wú)法在舊版本上加載(因?yàn)槿鄙俜?hào))。
從Python 3.2開(kāi)始,受限API可用的函數(shù)集記錄在 PEP 384 。在C API文檔中,不屬于受限API的API元素標(biāo)記為 “不屬于受限API” 。
