App下載

什么是Python Wheels? python.whl有什么用處?

猿友 2020-08-08 15:39:43 瀏覽數(shù) (7531)
反饋

Python .whl文件(或wheels)是python很少被提到的一部分,不過它們對python包的安裝過程相當(dāng)重要。如果你已經(jīng)使用pip安裝了python包,那么很大可能輪子(wheels)使你的安裝速度更快了,效率更高了。

輪子是Python生態(tài)系統(tǒng)的一個組件,它有助于使包的安裝工作正常進行。它們允許更快的安裝和更穩(wěn)定的包分發(fā)過程。在本教程中,您將深入了解輪子是什么,它們提供了什么好處,以及它們是如何獲得吸引力并使使用Python變得更方便的。

(推薦教程:python教程

輪子簡介

在學(xué)習(xí)如何將項目打包到輪子中之前,從用戶的角度了解使用輪子是什么樣子是很有幫助的。

可以像往常一樣在環(huán)境中安裝一個Python包來開始這個實驗。在這種情況下,安裝uWSGI 2.0.x版本:

$ 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需要經(jīng)過幾個不同的步驟:

  1. 在第3行,它下載一個名為uwsgi-2.0.18.tar.gzTAR文件(tarball),該文件是用gzip壓縮的。
  2. 在第6行,它接受tarball并通過調(diào)用setup.py構(gòu)建一個.whl文件。
  3. 在第7行,它將輪子標(biāo)記為uWSGI-2.0.18-cp38-cp38-macosx_10_15_x86_64.whl。
  4. 在第10行,它在構(gòu)建了輪子之后安裝實際的包。

pip檢索的tar.gz tarball是一個源分發(fā)包,或sdist,而不是一個輪子。在某些方面,sdist是輪子的反義詞。

源代碼發(fā)行版包含源代碼。這不僅包括Python代碼,還包括與包綁定的任何擴展模塊的源代碼(通常用Cc++編寫)。對于源發(fā)行版,擴展模塊是在用戶端而不是開發(fā)人員端編譯的。

源分發(fā)版還包含一個元數(shù)據(jù)包,位于名為.egg-info的目錄中。該元數(shù)據(jù)有助于構(gòu)建和安裝包,但用戶實際上并不需要使用它做任何事情。

從開發(fā)人員的角度來看,當(dāng)您運行以下命令時,會創(chuàng)建一個源分發(fā)包:

$ python setup.py sdist

現(xiàn)在嘗試安裝一個不同的包:chardet:

$ 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-anywhl遵循特定的命名約定,稍后您將看到。從用戶的角度來看,更重要的是,當(dāng)pipPyPI上找到一個兼容的滾輪時,并不存在構(gòu)建階段。

從開發(fā)人員的角度來看,輪子是運行以下命令的結(jié)果:

$ python setup.py bdist_wheel

為什么uWSGI給你一個源分布,而chardet提供一個輪子?您可以通過查看PyPI上每個項目的頁面并導(dǎo)航到下載文件區(qū)域來了解原因。本節(jié)將向您展示pipPyPI索引服務(wù)器上實際看到的內(nèi)容:

  1. 由于項目的復(fù)雜性,uWSGI只提供了一個源分發(fā)版(uWSGI -2.0.18.tar.gz)。
  2. chardet同時提供了一個輪盤和一個源代碼發(fā)行版,但是如果與您的系統(tǒng)兼容,pip會更喜歡輪盤。稍后您將看到如何確定兼容性。

另一個用于輪子安裝的兼容性檢查示例是psycopg2,它為Windows提供了大量的車輪,但沒有為LinuxmacOS客戶端提供任何輪子。這意味著,根據(jù)您的具體設(shè)置,pip安裝psycopg2可以獲取一個滾輪或源分發(fā)版。

為了避免這些類型的兼容性問題,一些包提供了多個輪子,每個輪子都針對特定的Python實現(xiàn)和底層操作系統(tǒng)。

到目前為止,您已經(jīng)看到了輪子和sdist之間的一些明顯區(qū)別,但更重要的是這些區(qū)別對安裝過程的影響。

(推薦微課:python3基礎(chǔ)微課

輪子加速安裝

在上面,您看到了獲取預(yù)構(gòu)建輪子的安裝和下載sdist的安裝的比較。輪子使得Python包的端到端安裝速度更快,原因有兩個:

  1. 在其他條件相同的情況下,輪子通常比源分發(fā)包更小,這意味著它們可以在網(wǎng)絡(luò)中更快地移動。
  2. 直接從wheels安裝避免了從源分發(fā)版構(gòu)建包的中間步驟。

幾乎可以保證,安裝chardet只需uWSGI所需時間的一小部分。然而,這是一種不公平的比較,因為chardet是一個明顯更小和更簡單的包。使用不同的命令,您可以創(chuàng)建一個更直接的比較,它將演示輪子造成的差異有多大。

你可以通過-no-binary選項讓pip忽略它對車輪的傾斜:

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

這個命令計算加密包的安裝時間,告訴pip使用源分發(fā)包,即使有合適的輪可用。包括:all:使規(guī)則適用于密碼學(xué)及其所有依賴關(guān)系。

在我的機器上,從開始到結(jié)束大約需要32秒。不僅安裝要花費很長時間,而且構(gòu)建加密還需要提供OpenSSL開發(fā)頭,并可用于Python。

現(xiàn)在可以重新安裝密碼學(xué),但是這次要確保pip使用來自PyPIwheels。因為pip更喜歡輪子,所以這類似于完全不帶參數(shù)調(diào)用pip install。但在這種情況下,你可以讓意圖顯式通過要求車輪-純二進制:

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

以上就是關(guān)于 Python Wheels 的相關(guān)介紹了,希望對大家有所幫助。

0 人點贊