為什麼 Python 開發人員應該使用 Pipenv

Lacey Williams Henschel, Jeff Triplett發表於2018-07-07

只用了一年, Pipenv 就變成了管理軟體包依賴關係的 Python 官方推薦資源。

為什麼 Python 開發人員應該使用 Pipenv

Pipenv 是由 Kenneth Reitz 在一年多前建立的“面向開發者而生的 Python 開發工作流”,它已經成為管理軟體包依賴關係的 Python 官方推薦資源。但是對於它解決了什麼問題,以及它如何比使用 piprequirements.txt 檔案的標準工作流更有用處,這兩點仍然存在困惑。在本月的 Python 專欄中,我們將填補這些空白。

Python 包安裝簡史

為了理解 Pipenv 所解決的問題,看一看 Python 包管理如何發展十分有用的。

讓我們回到第一個 Python 版本,這時我們有了 Python,但是沒有乾淨的方法來安裝軟體包。

然後有了 Easy Install,這是一個可以相對容易地安裝其他 Python 包的軟體包,但它也帶來了一個問題:解除安裝不需要的包並不容易。

pip 登場,絕大多數 Python 使用者都熟悉它。pip 可以讓我們安裝和解除安裝包。我們可以指定版本,執行 pip freeze > requirements.txt 來輸出一個已安裝包列表到一個文字檔案,還可以用相同的文字檔案配合 pip install -r requirements.txt 來安裝一個應用程式需要的所有包。

但是 pip 並沒有包含將軟體包彼此隔離的方法。我們可能會開發使用相同庫的不同版本的應用程式,因此我們需要一種方法來實現這一點。隨之而來的是虛擬環境,它使我們能夠為我們開發的每個應用程式建立一個小型的、隔離的環境。我們已經看到了許多管理虛擬環境的工具:virtualenvvenvvirtualenvwrapperpyenvpyenv-virtualenvpyenv-virtualenvwrapper 等等。它們都可以很好地使用 piprequirements.txt 檔案。

新方法:Pipenv

Pipenv 旨在解決幾個問題:

首先,需要 pip 庫來安裝包,外加一個用於建立虛擬環境的庫,以及用於管理虛擬環境的庫,再有與這些庫相關的所有命令。這些都需要管理。Pipenv 附帶包管理和虛擬環境支援,因此你可以使用一個工具來安裝、解除安裝、跟蹤和記錄依賴性,並建立、使用和組織你的虛擬環境。當你使用它啟動一個專案時,如果你還沒有使用虛擬環境的話,Pipenv 將自動為該專案建立一個虛擬環境。

Pipenv 透過放棄 requirements.txt 規範轉而將其移動到一個名為 Pipfile 的新文件中來完成這種依賴管理。當你使用 Pipenv 安裝一個庫時,專案的 Pipfile 會自動更新安裝細節,包括版本資訊,還有可能的 Git 倉庫位置、檔案路徑和其他資訊。

其次,Pipenv 希望能更容易地管理複雜的相互依賴關係。你的應用程式可能依賴於某個特定版本的庫,而那個庫可能依賴於另一個特定版本的庫,這些依賴關係如海龜般堆疊起來。當你的應用程式使用的兩個庫有衝突的依賴關係時,你的情況會變得很艱難。Pipenv 希望透過在一個名為 Pipfile.lock 的檔案中跟蹤應用程式相互依賴關係樹來減輕這種痛苦。Pipfile.lock 還會驗證生產中是否使用了正確版本的依賴關係。

另外,當多個開發人員在開發一個專案時,Pipenv 很方便。透過 pip 工作流,凱西可能會安裝一個庫,並花兩天時間使用該庫實現一個新功能。當凱西提交更改時,他可能會忘記執行 pip freeze 來更新 requirements.txt 檔案。第二天,傑米拉取凱西的改變,測試就突然失敗了。這樣會花費好一會兒才能意識到問題是在 requirements.txt 檔案中缺少相關庫,而傑米尚未在虛擬環境中安裝這些檔案。

因為 Pipenv 會在安裝時自動記錄依賴性,如果傑米和凱西使用了 Pipenv,Pipfile 會自動更新幷包含在凱西的提交中。這樣傑米和凱西就可以節省時間並更快地運送他們的產品。

最後,將 Pipenv 推薦給在你專案上工作的其他人,因為它使用標準化的方式來安裝專案依賴項和開發和測試的需求。使用 pip 工作流和 requirements.txt 檔案意味著你可能只有一個 requirements.txt 檔案,或針對不同環境的多個 requirements.txt 檔案。例如,你的同事可能不清楚他們是否應該在他們的膝上型電腦上執行專案時是執行 dev.txt 還是 local.txt。當兩個相似的 requirements.txt 檔案彼此不同步時它也會造成混淆:local.txt 是否過時了,還是真的應該與 dev.txt 不同?多個 requirements.txt 檔案需要更多的上下文和文件,以使其他人能夠按照預期正確安裝依賴關係。這個工作流程有可能會混淆同時並增加你的維護負擔。

使用 Pipenv,它會生成 Pipfile,透過為你管理對不同環境的依賴關係,可以避免這些問題。該命令將安裝主專案依賴項:

pipenv install

新增 --dev 標誌將安裝開發/測試的 requirements.txt

pipenv install --dev

使用 Pipenv 還有其他好處:它具有更好的安全特性,以易於理解的格式繪製你的依賴關係,無縫處理 .env 檔案,並且可以在一個檔案中自動處理開發與生產環境的不同依賴關係。你可以在文件中閱讀更多內容。

使用 Pipenv

使用 Pipenv 的基礎知識在官方 Python 包管理教程管理應用程式依賴關係部分中詳細介紹。要安裝 Pipenv,使用 pip

pip install pipenv

要安裝在專案中使用的包,請更改為專案的目錄。然後安裝一個包(我們將使用 Django 作為例子),執行:

pipenv install django

你會看到一些輸出,表明 Pipenv 正在為你的專案建立一個 Pipfile

如果你還沒有使用虛擬環境,你還會看到 Pipenv 的一些輸出,說明它正在為你建立一個虛擬環境。

然後,你將看到你在安裝包時常看到的輸出。

為了生成 Pipfile.lock 檔案,執行:

pipenv lock

你也可以使用 Pipenv 執行 Python 指令碼。執行名為 hello.py 的上層 Python 指令碼:

pipenv run python hello.py

你將在控制檯中看到預期結果。

啟動一個 shell,執行:

pipenv shell

如果你想將當前使用 requirements.txt 檔案的專案轉換為使用 Pipenv,請安裝 Pipenv 並執行:

pipenv install requirements.txt

這將建立一個 Pipfile 並安裝指定的 requirements.txt。考慮一下升級你的專案!

瞭解更多

檢視 Pipenv 文件,特別是 Pipenv 的基本用法,以幫助你進一步學習。Pipenv 的建立者 Kenneth Reitz 為 Pipenv 在最近的 PyTennessee 發表了一篇演講:“Python 依賴管理的未來”。這次演講沒有被記錄下來,但他的幻燈片有助於理解 Pipenv 所做的以及解決的問題。


via: https://opensource.com/article/18/2/why-python-devs-should-use-pipenv

作者:Lacey Williams Henschel, Jeff Triplett 譯者:MjSeven 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章