国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python wheel 包命名規則和 abi 兼容

妤鋒シ / 1979人閱讀

摘要:注意,本文內容基于。包的命名規定包的命名格式為。其中各個的意義和取值在中有規定標記了具體的實現。舉為例,首先必須包含的是實現名和版本號,比如對應的是其次,需要包含構建時特定的選項。反之,則不存在。不過判斷給定包的兼容的做法與此有些許差異。

注意,本文內容基于python 2。python 3的處理方式可能有所不同,有需要的讀者可以自己了解一下。

wheel 包的命名規定

wheel 包的命名格式為 {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl
其中各個 tag 的意義和取值在 PEP425 中有規定:https://www.python.org/dev/pe...

python tag 標記了具體的 python 實現。其中:

py 無實現特定的拓展

cp CPython,也就是通常使用的 Python 實現

ip IronPython,跑在 Windows CLI 平臺上的 Python 實現

pp PyPy,帶 JIT 的 Python 實現

jy Jython,跑在 JVM 上的 Python 實現

舉個例子,如果 wheel 包里面包含了 C 拓展,那么打包出來的 python tag 就是 cpxx,其中 xx 是具體的版本號,如 cp27.

platform tag 也好理解,就是系統 _ 架構。比如 linux_x86_64

最陌生的恐怕是之間的 abi tag,這正是本文討論的主題。

abi 這東西,看不見摸不著。系統上的東西嘛,敲下個命令就知道是什么操作系統;架構雖然玄乎點,不過也就是那么幾種;然而有多少人知道自己當前使用的平臺遵循著怎樣的 abi 標準?什么時候 abi 可以兼容,什么時候又不可以?

pip wheel 打包時,abi tag是怎么敲定的

Python 對此有另外一個 PEP:https://www.python.org/dev/pe...

如果 sysconfig 定義了 SOABI,那么就用 SOABI 的值。當然這是 Python 3 的事務,這里我自然不用管。如果沒定義 SOABI,比如 Python 2,wheel 會生成一個類似的 abi tag。在 Python 的標準里,這個 abi 取決于打包時使用的 Python 實現。舉 CPython 為例,首先必須包含的是實現名和版本號,比如 CPython2.7.9 對應的是 cp27.其次,需要包含構建 CPython 時特定的選項。具體來說,打包時會依次判斷當前的 CPython 是否有下列的功能,如果有,加上對應的 flag:

--with-pydebug (flag: d )

--with-pymalloc (flag: m )

--with-wide-unicode (flag: u )

通常,我們看到的 abi tag 會是這樣的 cp27mu,這是因為 --with-pymalloc 是默認開啟的,而包管理中分發的 CPython 會加上 --with-wide-unicode 選項。

有趣的是,如果打包時沒辦法判斷 abi 類型,生成的 abi tag 會是 none。而如果 Python 包是不依賴特定的 abi 的純 Python 實現,生成的 abi tag 也是 none。在安裝時,值為 none 的 abi tag 會享受特殊待遇。這個下文再說。

另外同樣的 Python 代碼打出來 abi tag 相同的包,不一定完全一樣。以我的親身經歷舉例,pycrypto 這個庫,在打包的時候會判斷 libgmp 是否存在,如果存在,就構建 _fastmath 這個庫。如果打包平臺上存在 libgmp,打出來的包就會包含 _fastmath。反之,則不存在。而這兩種情形下打出來的包,名字是一模一樣的。

如何判斷給定 wheel 包是否能夠安裝

通常判斷依賴的時候,需要看下是否符合最低版本。不過 pip 判斷給定 wheel 包的 abi 兼容的做法與此有些許差異。pip 的做法是,計算出一個支持的 abi tag 集合,然后判斷目標 abi tag 是否在這個集合里。這個計算過程跟在打包時是一樣的。這意味著,打包拓展的 CPython 需要跟安裝的機器上的 CPython 版本是一致的,否則就裝不了。對于“永遠的2.7”來說,這不是什么問題;不過如果用的是 Python 3,又不能控制具體的 CPython 版本,對于 C 拓展還是現場編譯安裝比較靠譜。

其實說了這么多,還不如跑一個腳本:
/usr/local/lib/python2.7/site-packages/pip/pep425tags.py

pip 會運行這個腳本來判斷 wheel 包。所以你只要

from pip import pep425tags
print(pep425tags.get_supported())

就能報出該系統上支持的 wheel 包名字。

當然對于 abi tag 為 none 的包,它可以在任何一個 abi 版本上安裝。因為所有的平臺都至少支持 none abi。但如果一個平臺上的 Python 如此古怪,以致于沒辦法確定它的 abi 類型,那么也就只能裝上 abi tag 為 none 的包,即純 Python 實現抑或同樣古怪得無法判斷打包時的 abi 的包。真是同類相聚啊。順便一提,在 Ubuntu 14.04 和同期的系統,通過包管理安裝的 pip 有一個已知 bug,有些時候無法正確判斷 abi 類型,所以打出來的包的 tag 是 none,且任何帶特定 abi 的包都裝不上去。我們曾經遇到這個 bug,最后通過升級 pip 解決了。感興趣的讀者可以比較這包管理版本和最新版本,兩個 pip 的 pep425tags.py 有什么異同。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44318.html

相關文章

  • 在 MaxCompute UDF 中運行 Scipy

    摘要:編寫完成后,將代碼保存為,并在中執行此后創建函數。執行創建后,便可以在中執行查詢暫不支持,因而需禁用其他如果包依賴了其他包,需要一并上傳并同時加入到依賴中。 摘要: 新版 MaxCompute Isolation Session 支持 Python UDF。也就是說,Python UDF 中已經可以跑二進制包。剛才以 Scipy 為例踩了一下坑,把相關的過程分享出來。 新版 MaxCo...

    kbyyd24 評論0 收藏0
  • 通過demo學習OpenStack開發所需的基礎知識 -- 軟件管理

    摘要:不幸的是,在軟件包管理十分混亂,至少歷史上十分混亂。的最大改進是將函數的參數單獨放到一個的文件中這些成為包的元數據。基于的版本號管理。的版本推導這里重點說明一下基于的版本號管理這個功能。開發版本號的形式如下。 為什么寫這個系列 OpenStack是目前我所知的最大最復雜的基于Python項目。整個OpenStack項目包含了數十個主要的子項目,每個子項目所用到的庫也不盡相同。因此,對于...

    blastz 評論0 收藏0
  • Python Tips

    摘要:的三種數據類型字典列表元組,分別用花括號中括號小括號表示。約等于上句,可能是因為自定義變量名與內部函數或變量同名了。下,默認路徑一般為。的日志模塊中計時器定時器計劃任務,。對象的問題怎樣忽略警告不打印煩人的警告打印到終端同時記錄到文件。 Python Enhancement Proposal。(PEP,Python增強建議書) Python之禪(import this) Pytho...

    Reducto 評論0 收藏0
  • Node.js 指南(ABI穩定性)

    摘要:確保兼容性的剩余責任在于團隊維護頭文件,這些頭文件提供了在編譯時在中保持穩定的。中的穩定性提供由幾個獨立團隊維護的頭文件,例如,團隊維護諸如和之類的頭文件。由團隊維護,盡管與團隊密切合作,但該團隊是獨立的,并且有自己的時間表和優先級。 ABI穩定性 介紹 應用程序二進制接口(ABI)是程序調用函數和使用其他編譯程序的數據結構的一種方法,它是應用程序編程接口(API)的編譯版本,換句話說...

    Simon_Zhou 評論0 收藏0

發表評論

0條評論

妤鋒シ

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<