Python .whl
文件(或wheels)是python
很少被提到的一部分,不過(guò)它們對(duì)python包
的安裝過(guò)程相當(dāng)重要。如果你已經(jīng)使用pip
安裝了python包
,那么很大可能輪子(wheels)使你的安裝速度更快了,效率更高了。
輪子是Python
生態(tài)系統(tǒng)的一個(gè)組件,它有助于使包的安裝工作正常進(jìn)行。它們?cè)试S更快的安裝和更穩(wěn)定的包分發(fā)過(guò)程。在本教程中,您將深入了解輪子是什么,它們提供了什么好處,以及它們是如何獲得吸引力并使使用Python
變得更方便的。
(推薦教程:python教程)
輪子簡(jiǎn)介
在學(xué)習(xí)如何將項(xiàng)目打包到輪子中之前,從用戶的角度了解使用輪子是什么樣子是很有幫助的。
可以像往常一樣在環(huán)境中安裝一個(gè)Python包
來(lái)開始這個(gè)實(shí)驗(yàn)。在這種情況下,安裝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)過(guò)幾個(gè)不同的步驟:
- 在第3行,它下載一個(gè)名為
uwsgi-2.0.18.tar.gz
的TAR
文件(tarball),該文件是用gzip
壓縮的。 - 在第6行,它接受
tarball
并通過(guò)調(diào)用setup.py
構(gòu)建一個(gè).whl
文件。 - 在第7行,它將輪子標(biāo)記為
uWSGI-2.0
.18-cp38-cp38-macosx_10_15_x86_64.whl
。 - 在第10行,它在構(gòu)建了輪子之后安裝實(shí)際的包。
pip
檢索的tar.gz tarball
是一個(gè)源分發(fā)包,或sdist
,而不是一個(gè)輪子。在某些方面,sdist
是輪子的反義詞。
源代碼發(fā)行版包含源代碼。這不僅包括Python
代碼,還包括與包綁定的任何擴(kuò)展模塊的源代碼(通常用C
或c++
編寫)。對(duì)于源發(fā)行版,擴(kuò)展模塊是在用戶端而不是開發(fā)人員端編譯的。
源分發(fā)版還包含一個(gè)元數(shù)據(jù)包,位于名為.egg-info
的目錄中。該元數(shù)據(jù)有助于構(gòu)建和安裝包,但用戶實(shí)際上并不需要使用它做任何事情。
從開發(fā)人員的角度來(lái)看,當(dāng)您運(yùn)行以下命令時(shí),會(huì)創(chuàng)建一個(gè)源分發(fā)包:
$ python setup.py sdist
現(xiàn)在嘗試安裝一個(gè)不同的包: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
您可以看到一個(gè)與uWSGI
安裝明顯不同的輸出。
安裝chardet
時(shí)直接從PyPI
下載一個(gè).whl
文件。車輪名稱為chardet-3.0.4-py2.py3-none-any
。whl
遵循特定的命名約定,稍后您將看到。從用戶的角度來(lái)看,更重要的是,當(dāng)pip
在PyPI
上找到一個(gè)兼容的滾輪時(shí),并不存在構(gòu)建階段。
從開發(fā)人員的角度來(lái)看,輪子是運(yùn)行以下命令的結(jié)果:
$ python setup.py bdist_wheel
為什么uWSGI
給你一個(gè)源分布,而chardet
提供一個(gè)輪子?您可以通過(guò)查看PyPI
上每個(gè)項(xiàng)目的頁(yè)面并導(dǎo)航到下載文件區(qū)域來(lái)了解原因。本節(jié)將向您展示pip
在PyPI
索引服務(wù)器上實(shí)際看到的內(nèi)容:
- 由于項(xiàng)目的復(fù)雜性,
uWSGI
只提供了一個(gè)源分發(fā)版(uWSGI -2.0.18.tar.gz)。 chardet
同時(shí)提供了一個(gè)輪盤和一個(gè)源代碼發(fā)行版,但是如果與您的系統(tǒng)兼容,pip
會(huì)更喜歡輪盤。稍后您將看到如何確定兼容性。
另一個(gè)用于輪子安裝的兼容性檢查示例是psycopg2
,它為Windows
提供了大量的車輪,但沒(méi)有為Linux
或macOS
客戶端提供任何輪子。這意味著,根據(jù)您的具體設(shè)置,pip
安裝psycopg2
可以獲取一個(gè)滾輪或源分發(fā)版。
為了避免這些類型的兼容性問(wèn)題,一些包提供了多個(gè)輪子,每個(gè)輪子都針對(duì)特定的Python
實(shí)現(xiàn)和底層操作系統(tǒng)。
到目前為止,您已經(jīng)看到了輪子和sdist
之間的一些明顯區(qū)別,但更重要的是這些區(qū)別對(duì)安裝過(guò)程的影響。
(推薦微課:python3基礎(chǔ)微課)
輪子加速安裝
在上面,您看到了獲取預(yù)構(gòu)建輪子的安裝和下載sdist
的安裝的比較。輪子使得Python包
的端到端安裝速度更快,原因有兩個(gè):
- 在其他條件相同的情況下,輪子通常比源分發(fā)包更小,這意味著它們可以在網(wǎng)絡(luò)中更快地移動(dòng)。
- 直接從
wheels
安裝避免了從源分發(fā)版構(gòu)建包的中間步驟。
幾乎可以保證,安裝chardet
只需uWSGI
所需時(shí)間的一小部分。然而,這是一種不公平的比較,因?yàn)?code>chardet是一個(gè)明顯更小和更簡(jiǎn)單的包。使用不同的命令,您可以創(chuàng)建一個(gè)更直接的比較,它將演示輪子造成的差異有多大。
你可以通過(guò)-no-binary
選項(xiàng)讓pip
忽略它對(duì)車輪的傾斜:
$ time python -m pip install \
--no-cache-dir \
--force-reinstall \
--no-binary=:all: \
cryptography
這個(gè)命令計(jì)算加密包的安裝時(shí)間,告訴pip
使用源分發(fā)包,即使有合適的輪可用。包括:all:
使規(guī)則適用于密碼學(xué)及其所有依賴關(guān)系。
在我的機(jī)器上,從開始到結(jié)束大約需要32秒。不僅安裝要花費(fèi)很長(zhǎng)時(shí)間,而且構(gòu)建加密還需要提供OpenSSL
開發(fā)頭,并可用于Python
。
現(xiàn)在可以重新安裝密碼學(xué),但是這次要確保pip
使用來(lái)自PyPI
的wheels
。因?yàn)?code>pip更喜歡輪子,所以這類似于完全不帶參數(shù)調(diào)用pip install
。但在這種情況下,你可以讓意圖顯式通過(guò)要求車輪-純二進(jìn)制:
此選項(xiàng)僅花費(fèi)4秒多一點(diǎn)的時(shí)間,即僅為密碼學(xué)及其依賴項(xiàng)使用源分發(fā)版時(shí)所用時(shí)間的八分之一。
以上就是關(guān)于 Python Wheels
的相關(guān)介紹了,希望對(duì)大家有所幫助。