摘要:注意,本文內(nèi)容基于。包的命名規(guī)定包的命名格式為。其中各個(gè)的意義和取值在中有規(guī)定標(biāo)記了具體的實(shí)現(xiàn)。舉為例,首先必須包含的是實(shí)現(xiàn)名和版本號(hào),比如對(duì)應(yīng)的是其次,需要包含構(gòu)建時(shí)特定的選項(xiàng)。反之,則不存在。不過判斷給定包的兼容的做法與此有些許差異。
注意,本文內(nèi)容基于python 2。python 3的處理方式可能有所不同,有需要的讀者可以自己了解一下。
wheel 包的命名規(guī)定wheel 包的命名格式為 {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl。
其中各個(gè) tag 的意義和取值在 PEP425 中有規(guī)定:https://www.python.org/dev/pe...
python tag 標(biāo)記了具體的 python 實(shí)現(xiàn)。其中:
py 無實(shí)現(xiàn)特定的拓展
cp CPython,也就是通常使用的 Python 實(shí)現(xiàn)
ip IronPython,跑在 Windows CLI 平臺(tái)上的 Python 實(shí)現(xiàn)
pp PyPy,帶 JIT 的 Python 實(shí)現(xiàn)
jy Jython,跑在 JVM 上的 Python 實(shí)現(xiàn)
舉個(gè)例子,如果 wheel 包里面包含了 C 拓展,那么打包出來的 python tag 就是 cpxx,其中 xx 是具體的版本號(hào),如 cp27.
platform tag 也好理解,就是系統(tǒng) _ 架構(gòu)。比如 linux_x86_64。
最陌生的恐怕是之間的 abi tag,這正是本文討論的主題。
abi 這東西,看不見摸不著。系統(tǒng)上的東西嘛,敲下個(gè)命令就知道是什么操作系統(tǒng);架構(gòu)雖然玄乎點(diǎn),不過也就是那么幾種;然而有多少人知道自己當(dāng)前使用的平臺(tái)遵循著怎樣的 abi 標(biāo)準(zhǔn)?什么時(shí)候 abi 可以兼容,什么時(shí)候又不可以?
pip wheel 打包時(shí),abi tag是怎么敲定的Python 對(duì)此有另外一個(gè) PEP:https://www.python.org/dev/pe...
如果 sysconfig 定義了 SOABI,那么就用 SOABI 的值。當(dāng)然這是 Python 3 的事務(wù),這里我自然不用管。如果沒定義 SOABI,比如 Python 2,wheel 會(huì)生成一個(gè)類似的 abi tag。在 Python 的標(biāo)準(zhǔn)里,這個(gè) abi 取決于打包時(shí)使用的 Python 實(shí)現(xiàn)。舉 CPython 為例,首先必須包含的是實(shí)現(xiàn)名和版本號(hào),比如 CPython2.7.9 對(duì)應(yīng)的是 cp27.其次,需要包含構(gòu)建 CPython 時(shí)特定的選項(xiàng)。具體來說,打包時(shí)會(huì)依次判斷當(dāng)前的 CPython 是否有下列的功能,如果有,加上對(duì)應(yīng)的 flag:
--with-pydebug (flag: d )
--with-pymalloc (flag: m )
--with-wide-unicode (flag: u )
通常,我們看到的 abi tag 會(huì)是這樣的 cp27mu,這是因?yàn)?--with-pymalloc 是默認(rèn)開啟的,而包管理中分發(fā)的 CPython 會(huì)加上 --with-wide-unicode 選項(xiàng)。
有趣的是,如果打包時(shí)沒辦法判斷 abi 類型,生成的 abi tag 會(huì)是 none。而如果 Python 包是不依賴特定的 abi 的純 Python 實(shí)現(xiàn),生成的 abi tag 也是 none。在安裝時(shí),值為 none 的 abi tag 會(huì)享受特殊待遇。這個(gè)下文再說。
另外同樣的 Python 代碼打出來 abi tag 相同的包,不一定完全一樣。以我的親身經(jīng)歷舉例,pycrypto 這個(gè)庫,在打包的時(shí)候會(huì)判斷 libgmp 是否存在,如果存在,就構(gòu)建 _fastmath 這個(gè)庫。如果打包平臺(tái)上存在 libgmp,打出來的包就會(huì)包含 _fastmath。反之,則不存在。而這兩種情形下打出來的包,名字是一模一樣的。
如何判斷給定 wheel 包是否能夠安裝通常判斷依賴的時(shí)候,需要看下是否符合最低版本。不過 pip 判斷給定 wheel 包的 abi 兼容的做法與此有些許差異。pip 的做法是,計(jì)算出一個(gè)支持的 abi tag 集合,然后判斷目標(biāo) abi tag 是否在這個(gè)集合里。這個(gè)計(jì)算過程跟在打包時(shí)是一樣的。這意味著,打包拓展的 CPython 需要跟安裝的機(jī)器上的 CPython 版本是一致的,否則就裝不了。對(duì)于“永遠(yuǎn)的2.7”來說,這不是什么問題;不過如果用的是 Python 3,又不能控制具體的 CPython 版本,對(duì)于 C 拓展還是現(xiàn)場(chǎng)編譯安裝比較靠譜。
其實(shí)說了這么多,還不如跑一個(gè)腳本:
/usr/local/lib/python2.7/site-packages/pip/pep425tags.py
pip 會(huì)運(yùn)行這個(gè)腳本來判斷 wheel 包。所以你只要
from pip import pep425tags print(pep425tags.get_supported())
就能報(bào)出該系統(tǒng)上支持的 wheel 包名字。
當(dāng)然對(duì)于 abi tag 為 none 的包,它可以在任何一個(gè) abi 版本上安裝。因?yàn)樗械钠脚_(tái)都至少支持 none abi。但如果一個(gè)平臺(tái)上的 Python 如此古怪,以致于沒辦法確定它的 abi 類型,那么也就只能裝上 abi tag 為 none 的包,即純 Python 實(shí)現(xiàn)抑或同樣古怪得無法判斷打包時(shí)的 abi 的包。真是同類相聚啊。順便一提,在 Ubuntu 14.04 和同期的系統(tǒng),通過包管理安裝的 pip 有一個(gè)已知 bug,有些時(shí)候無法正確判斷 abi 類型,所以打出來的包的 tag 是 none,且任何帶特定 abi 的包都裝不上去。我們?cè)?jīng)遇到這個(gè) bug,最后通過升級(jí) pip 解決了。感興趣的讀者可以比較這包管理版本和最新版本,兩個(gè) pip 的 pep425tags.py 有什么異同。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44318.html
摘要:編寫完成后,將代碼保存為,并在中執(zhí)行此后創(chuàng)建函數(shù)。執(zhí)行創(chuàng)建后,便可以在中執(zhí)行查詢暫不支持,因而需禁用其他如果包依賴了其他包,需要一并上傳并同時(shí)加入到依賴中。 摘要: 新版 MaxCompute Isolation Session 支持 Python UDF。也就是說,Python UDF 中已經(jīng)可以跑二進(jìn)制包。剛才以 Scipy 為例踩了一下坑,把相關(guān)的過程分享出來。 新版 MaxCo...
摘要:不幸的是,在軟件包管理十分混亂,至少歷史上十分混亂。的最大改進(jìn)是將函數(shù)的參數(shù)單獨(dú)放到一個(gè)的文件中這些成為包的元數(shù)據(jù)?;诘陌姹咎?hào)管理。的版本推導(dǎo)這里重點(diǎn)說明一下基于的版本號(hào)管理這個(gè)功能。開發(fā)版本號(hào)的形式如下。 為什么寫這個(gè)系列 OpenStack是目前我所知的最大最復(fù)雜的基于Python項(xiàng)目。整個(gè)OpenStack項(xiàng)目包含了數(shù)十個(gè)主要的子項(xiàng)目,每個(gè)子項(xiàng)目所用到的庫也不盡相同。因此,對(duì)于...
摘要:的三種數(shù)據(jù)類型字典列表元組,分別用花括號(hào)中括號(hào)小括號(hào)表示。約等于上句,可能是因?yàn)樽远x變量名與內(nèi)部函數(shù)或變量同名了。下,默認(rèn)路徑一般為。的日志模塊中計(jì)時(shí)器定時(shí)器計(jì)劃任務(wù),。對(duì)象的問題怎樣忽略警告不打印煩人的警告打印到終端同時(shí)記錄到文件。 Python Enhancement Proposal。(PEP,Python增強(qiáng)建議書) Python之禪(import this) Pytho...
摘要:確保兼容性的剩余責(zé)任在于團(tuán)隊(duì)維護(hù)頭文件,這些頭文件提供了在編譯時(shí)在中保持穩(wěn)定的。中的穩(wěn)定性提供由幾個(gè)獨(dú)立團(tuán)隊(duì)維護(hù)的頭文件,例如,團(tuán)隊(duì)維護(hù)諸如和之類的頭文件。由團(tuán)隊(duì)維護(hù),盡管與團(tuán)隊(duì)密切合作,但該團(tuán)隊(duì)是獨(dú)立的,并且有自己的時(shí)間表和優(yōu)先級(jí)。 ABI穩(wěn)定性 介紹 應(yīng)用程序二進(jìn)制接口(ABI)是程序調(diào)用函數(shù)和使用其他編譯程序的數(shù)據(jù)結(jié)構(gòu)的一種方法,它是應(yīng)用程序編程接口(API)的編譯版本,換句話說...
閱讀 3041·2023-04-25 18:06
閱讀 3318·2021-11-22 09:34
閱讀 2873·2021-08-12 13:30
閱讀 2061·2019-08-30 15:44
閱讀 1675·2019-08-30 13:09
閱讀 1642·2019-08-30 12:45
閱讀 1726·2019-08-29 11:13
閱讀 3621·2019-08-28 17:51