什麼是Python Wheels?爲什麼要學Python Wheels

2020-08-12 14:33:10

前言

Python .whl檔案(或wheels)是Python中很少討論的一部分,但是它們對Python包的安裝過程非常重要。如果您已經使用pip安裝了Python包,那麼很有可能是輪子(wheels)使安裝速度更快、效率更高了。

輪子是Python生態系統的一個元件,它有助於使包的安裝工作正常進行。它們允許更快的安裝和更穩定的包分發過程。

在本教學中,您將深入瞭解輪子是什麼,它們提供了什麼好處,以及它們是如何獲得吸引力並使使用Python變得更方便的。

輪子簡介

在學習如何將專案打包到輪子中之前,從使用者的角度瞭解使用輪子是什麼樣子是很有幫助的。可以像往常一樣在環境中安裝一個Python包來開始這個實驗。

在這種情況下,安裝uWSGI 2.0.x版本:

 1 $ python -m pip install 'uwsgi==2.0.*' 
 2 Collecting uwsgi==2.0.* 
 3   Downloading uwsgi-2.0.18.tar.gz (801 kB) 
 4      |████████████████████████████████| 801 kB 1.1 MB/s 
 5 Building wheels for collected packages: uwsgi 
 6   Building wheel for uwsgi (setup.py) ... done 
 7   Created wheel for uwsgi ... uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl 
 8   Stored in directory: /private/var/folders/jc/8_hqsz0x1tdbp05 ... 
 9 Successfully built uwsgi 
10 Installing collected packages: uwsgi 
11 Successfully installed uwsgi-2.0.18 

要完全安裝uWSGI, pip需要經過幾個不同的步驟:

•在第3行,它下載一個名爲uwsgi-2.0.18.tar.gz的TAR檔案(tarball),該檔案是用gzip壓縮的。

•在第6行,它接受tarball並通過呼叫setup.py構建一個.whl檔案。

•在第7行,它將輪子標記爲uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl。

•在第10行,它在構建了輪子之後安裝實際的包。pip檢索的tar.gz tarball是一個源分發包,或sdist,而不是一個輪子。在

某些方面,sdist是輪子的反義詞。原始碼發行版包含原始碼。這不僅包括Python程式碼,還包括與包系結的任何擴充套件模組的原始碼(通常用C或c++編寫)。

對於源發行版,擴充套件模組是在使用者端而不是開發人員端編譯的。源分發版還包含一個元數據包,位於名爲.egg-info的目錄中。

該元數據有助於構建和安裝包,但使用者實際上並不需要使用它做任何事情。從開發人員的角度來看,當您執行以下命令時,會建立一個源分發包:

$ python setup.py sdist

現在嘗試安裝一個不同的包:chardet:

 1 $ python -m pip install 'chardet==3.*' 
 2 Collecting chardet 
 3   Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB) 
 4      |████████████████████████████████| 133 kB 1.5 MB/s 
 5 Installing collected packages: chardet 
 6 Successfully installed chardet-3.0.4 

您可以看到一個與uWSGI安裝明顯不同的輸出。

安裝chardet時直接從PyPI下載一個.whl檔案。車輪名稱爲chardet-3.0.4-py2.py3-none-any。whl遵循特定的命名約定,稍後您將看到。從使用者的角度來看,更重要的是,當pip在PyPI上找到一個相容的滾輪時,並不存在構建階段。

從開發人員的角度來看,輪子是執行以下命令的結果:

$ python setup.py bdist_wheel

爲什麼uWSGI給你一個源分佈,而chardet提供一個輪子?您可以通過檢視PyPI上每個專案的頁面並導航到下載檔案區域來了解原因。本節將向您展示pip在PyPI索引伺服器上實際看到的內容:

由於專案的複雜性,uWSGI只提供了一個源分發版(uWSGI -2.0.18.tar.gz)。chardet同時提供了一個輪盤和一個原始碼發行版,但是如果與您的系統相容,pip會更喜歡輪盤。稍後您將看到如何確定相容性。

另一個用於輪子安裝的相容性檢查範例是psycopg2,它爲Windows提供了大量的車輪,但沒有爲Linux或macOS用戶端提供任何輪子。這意味着,根據您的具體設定,pip安裝psycopg2可以獲取一個滾輪或源分發版。

爲了避免這些型別的相容性問題,一些包提供了多個輪子,每個輪子都針對特定的Python實現和底層操作系統。到目前爲止,您已經看到了輪子和sdist之間的一些明顯區別,但更重要的是這些區別對安裝過程的影響。

輪子加速安裝

在上面,您看到了獲取預構建輪子的安裝和下載sdist的安裝的比較。

輪子使得Python包的端到端安裝速度更快,原因有兩個:

•在其他條件相同的情況下,輪子通常比源分發包更小,這意味着它們可以在網路中更快地移動。

•直接從wheels安裝避免了從源分發版構建包的中間步驟。幾乎可以保證,安裝chardet只需uWSGI所需時間的一小部分。

然而,這是一種不公平的比較,因爲chardet是一個明顯更小和更簡單的包。使用不同的命令,您可以建立一個更直接的比較,它將演示輪子造成的差異有多大。你可以通過-no-binary選項讓pip忽略它對車輪的傾斜:

$ time python -m pip install \ 
      --no-cache-dir \ 
      --force-reinstall \ 
      --no-binary=:all: \ 
      cryptography

這個命令計算加密包的安裝時間,告訴pip使用源分發包,即使有合適的輪可用。包括:all:使規則適用於密碼學及其所有依賴關係。

在我的機器上,從開始到結束大約需要32秒。不僅安裝要花費很長時間,而且構建加密還需要提供OpenSSL開發頭,並可用於Python。

現在可以重新安裝密碼學,但是這次要確保pip使用來自PyPI的wheels。因爲pip更喜歡輪子,所以這類似於完全不帶參數呼叫pip install。但在這種情況下,你可以讓意圖顯式通過要求車輪-純二進制:

此選項僅花費4秒多一點的時間,即僅爲密碼學及其依賴項使用源分發版時所用時間的八分之一。

最近還爲大家精心整理了一份關於linux和python的學習資料大合集!有需要的可私信,或在「python頭條」後臺回覆 回復關鍵詞「資料合集」即可免費領取!