為什么Python開發(fā)人員應(yīng)該使用Pipenv
只用了一年, Pipenv 就變成了管理軟件包依賴關(guān)系的 Python 官方推薦資源。
Pipenv 是由 Kenneth Reitz 在一年多前創(chuàng)建的“面向開發(fā)者而生的 Python 開發(fā)工作流”,它已經(jīng)成為管理軟件包依賴關(guān)系的 Python 官方推薦資源。但是對于它解決了什么問題,以及它如何比使用 pip
和 requirements.txt
文件的標(biāo)準(zhǔn)工作流更有用處,這兩點仍然存在困惑。在本月的 Python 專欄中,我們將填補這些空白。
Python 包安裝簡史
為了理解 Pipenv 所解決的問題,看一看 Python 包管理如何發(fā)展十分有用的。
讓我們回到***個 Python 版本,這時我們有了 Python,但是沒有干凈的方法來安裝軟件包。
然后有了 Easy Install,這是一個可以相對容易地安裝其他 Python 包的軟件包,但它也帶來了一個問題:卸載不需要的包并不容易。
pip 登場,絕大多數(shù) Python 用戶都熟悉它。pip
可以讓我們安裝和卸載包。我們可以指定版本,運行 pip freeze > requirements.txt
來輸出一個已安裝包列表到一個文本文件,還可以用相同的文本文件配合 pip install -r requirements.txt
來安裝一個應(yīng)用程序需要的所有包。
但是 pip
并沒有包含將軟件包彼此隔離的方法。我們可能會開發(fā)使用相同庫的不同版本的應(yīng)用程序,因此我們需要一種方法來實現(xiàn)這一點。隨之而來的是虛擬環(huán)境,它使我們能夠為我們開發(fā)的每個應(yīng)用程序創(chuàng)建一個小型的、隔離的環(huán)境。我們已經(jīng)看到了許多管理虛擬環(huán)境的工具:virtualenv、 venv、 virtualenvwrapper、 pyenv、 pyenv-virtualenv、 pyenv-virtualenvwrapper 等等。它們都可以很好地使用 pip
和 requirements.txt
文件。
新方法:Pipenv
Pipenv 旨在解決幾個問題:
首先,需要 pip
庫來安裝包,外加一個用于創(chuàng)建虛擬環(huán)境的庫,以及用于管理虛擬環(huán)境的庫,再有與這些庫相關(guān)的所有命令。這些都需要管理。Pipenv 附帶包管理和虛擬環(huán)境支持,因此你可以使用一個工具來安裝、卸載、跟蹤和記錄依賴性,并創(chuàng)建、使用和組織你的虛擬環(huán)境。當(dāng)你使用它啟動一個項目時,如果你還沒有使用虛擬環(huán)境的話,Pipenv 將自動為該項目創(chuàng)建一個虛擬環(huán)境。
Pipenv 通過放棄 requirements.txt
規(guī)范轉(zhuǎn)而將其移動到一個名為 Pipfile 的新文檔中來完成這種依賴管理。當(dāng)你使用 Pipenv 安裝一個庫時,項目的 Pipfile
會自動更新安裝細節(jié),包括版本信息,還有可能的 Git 倉庫位置、文件路徑和其他信息。
其次,Pipenv 希望能更容易地管理復(fù)雜的相互依賴關(guān)系。你的應(yīng)用程序可能依賴于某個特定版本的庫,而那個庫可能依賴于另一個特定版本的庫,這些依賴關(guān)系如海龜般堆疊起來。當(dāng)你的應(yīng)用程序使用的兩個庫有沖突的依賴關(guān)系時,你的情況會變得很艱難。Pipenv 希望通過在一個名為 Pipfile.lock
的文件中跟蹤應(yīng)用程序相互依賴關(guān)系樹來減輕這種痛苦。Pipfile.lock
還會驗證生產(chǎn)中是否使用了正確版本的依賴關(guān)系。
另外,當(dāng)多個開發(fā)人員在開發(fā)一個項目時,Pipenv 很方便。通過 pip
工作流,凱西可能會安裝一個庫,并花兩天時間使用該庫實現(xiàn)一個新功能。當(dāng)凱西提交更改時,他可能會忘記運行 pip freeze
來更新 requirements.txt
文件。第二天,杰米拉取凱西的改變,測試就突然失敗了。這樣會花費好一會兒才能意識到問題是在 requirements.txt
文件中缺少相關(guān)庫,而杰米尚未在虛擬環(huán)境中安裝這些文件。
因為 Pipenv 會在安裝時自動記錄依賴性,如果杰米和凱西使用了 Pipenv,Pipfile
會自動更新并包含在凱西的提交中。這樣杰米和凱西就可以節(jié)省時間并更快地運送他們的產(chǎn)品。
***,將 Pipenv 推薦給在你項目上工作的其他人,因為它使用標(biāo)準(zhǔn)化的方式來安裝項目依賴項和開發(fā)和測試的需求。使用 pip
工作流和 requirements.txt
文件意味著你可能只有一個 requirements.txt
文件,或針對不同環(huán)境的多個 requirements.txt
文件。例如,你的同事可能不清楚他們是否應(yīng)該在他們的筆記本電腦上運行項目時是運行 dev.txt
還是 local.txt
。當(dāng)兩個相似的 requirements.txt
文件彼此不同步時它也會造成混淆:local.txt
是否過時了,還是真的應(yīng)該與 dev.txt
不同?多個 requirements.txt
文件需要更多的上下文和文檔,以使其他人能夠按照預(yù)期正確安裝依賴關(guān)系。這個工作流程有可能會混淆同時并增加你的維護負擔(dān)。
使用 Pipenv,它會生成 Pipfile
,通過為你管理對不同環(huán)境的依賴關(guān)系,可以避免這些問題。該命令將安裝主項目依賴項:
pipenv install
添加 --dev
標(biāo)志將安裝開發(fā)/測試的 requirements.txt
:
pipenv install --dev
使用 Pipenv 還有其他好處:它具有更好的安全特性,以易于理解的格式繪制你的依賴關(guān)系,無縫處理 .env
文件,并且可以在一個文件中自動處理開發(fā)與生產(chǎn)環(huán)境的不同依賴關(guān)系。你可以在文檔中閱讀更多內(nèi)容。
使用 Pipenv
使用 Pipenv 的基礎(chǔ)知識在官方 Python 包管理教程管理應(yīng)用程序依賴關(guān)系部分中詳細介紹。要安裝 Pipenv,使用 pip
:
pip install pipenv
要安裝在項目中使用的包,請更改為項目的目錄。然后安裝一個包(我們將使用 Django 作為例子),運行:
pipenv install django
你會看到一些輸出,表明 Pipenv 正在為你的項目創(chuàng)建一個 Pipfile
。
如果你還沒有使用虛擬環(huán)境,你還會看到 Pipenv 的一些輸出,說明它正在為你創(chuàng)建一個虛擬環(huán)境。
然后,你將看到你在安裝包時常看到的輸出。
為了生成 Pipfile.lock
文件,運行:
pipenv lock
你也可以使用 Pipenv 運行 Python 腳本。運行名為 hello.py
的上層 Python 腳本:
pipenv run python hello.py
你將在控制臺中看到預(yù)期結(jié)果。
啟動一個 shell,運行:
pipenv shell
如果你想將當(dāng)前使用 requirements.txt
文件的項目轉(zhuǎn)換為使用 Pipenv,請安裝 Pipenv 并運行:
pipenv install requirements.txt
這將創(chuàng)建一個 Pipfile 并安裝指定的 requirements.txt
??紤]一下升級你的項目!
了解更多
查看 Pipenv 文檔,特別是 Pipenv 的基本用法,以幫助你進一步學(xué)習(xí)。Pipenv 的創(chuàng)建者 Kenneth Reitz 為 Pipenv 在最近的 PyTennessee 發(fā)表了一篇演講:“Python 依賴管理的未來”。這次演講沒有被記錄下來,但他的幻燈片有助于理解 Pipenv 所做的以及解決的問題。