什麼是Python Wheels?爲何要關心它?








前言




Python .whl文件(或wheels)是Python中不多討論的一部分,可是它們對Python包的安裝過程很是重要。若是您已經使用pip安裝了Python包,那麼頗有多是輪子(wheels)使安裝速度更快、效率更高了。python


輪子是Python生態系統的一個組件,它有助於使包的安裝工做正常進行。它們容許更快的安裝和更穩定的包分發過程。在本教程中,您將深刻了解輪子是什麼,它們提供了什麼好處,以及它們是如何得到吸引力並使使用Python變得更方便的。c++
















輪子簡介



在學習如何將項目打包到輪子中以前,從用戶的角度瞭解使用輪子是什麼樣子是頗有幫助的。web


能夠像往常同樣在環境中安裝一個Python包來開始這個實驗。在這種狀況下,安裝uWSGI 2.0.x版本:shell


$ 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 uwsgi10 Installing collected packages: uwsgi11 Successfully installed uwsgi-2.0.18



要徹底安裝uWSGI, pip須要通過幾個不一樣的步驟:macos


  1. 在第3行,它下載一個名爲uwsgi-2.0.18.tar.gz的TAR文件(tarball),該文件是用gzip壓縮的。服務器

  2. 在第6行,它接受tarball並經過調用setup.py構建一個.whl文件。微信

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

  4. 在第10行,它在構建了輪子以後安裝實際的包。編輯器


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


源代碼發行版包含源代碼。這不只包括Python代碼,還包括與包綁定的任何擴展模塊的源代碼(一般用C或c++編寫)。對於源發行版,擴展模塊是在用戶端而不是開發人員端編譯的。


源分發版還包含一個元數據包,位於名爲.egg-info的目錄中。該元數據有助於構建和安裝包,但用戶實際上並不須要使用它作任何事情。


從開發人員的角度來看,當您運行如下命令時,會建立一個源分發包:


$ python setup.py sdist


如今嘗試安裝一個不一樣的包: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-any。whl遵循特定的命名約定,稍後您將看到。從用戶的角度來看,更重要的是,當pip在PyPI上找到一個兼容的滾輪時,並不存在構建階段。


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


$ python setup.py bdist_wheel


爲何uWSGI給你一個源分佈,而chardet提供一個輪子?您能夠經過查看PyPI上每一個項目的頁面並導航到下載文件區域來了解緣由。本節將向您展現pip在PyPI索引服務器上實際看到的內容:


  1. 因爲項目的複雜性,uWSGI只提供了一個源分發版(uWSGI -2.0.18.tar.gz)。

  2. chardet同時提供了一個輪盤和一個源代碼發行版,可是若是與您的系統兼容,pip會更喜歡輪盤。稍後您將看到如何肯定兼容性。


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


爲了不這些類型的兼容性問題,一些包提供了多個輪子,每一個輪子都針對特定的Python實現和底層操做系統。


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
















輪子加速安裝




在上面,您看到了獲取預構建輪子的安裝和下載sdist的安裝的比較。輪子使得Python包的端到端安裝速度更快,緣由有兩個:


  1. 在其餘條件相同的狀況下,輪子一般比源分發包更小,這意味着它們能夠在網絡中更快地移動。


  2. 直接從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秒多一點的時間,即僅爲密碼學及其依賴項使用源分發版時所用時間的八分之一。


英文原文:

https://realpython.com/python-wheels/






本文分享自微信公衆號 - Python學會(gh_39aead19f756)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索