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

原文出處: Lacey Williams Henschel, Jeff Triplett   譯文出處:linux中國-MjSeven   

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

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

Python 包安裝簡史

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

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

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

pip 登場,絕大多數 Python 用戶都熟悉它。pip 可以讓我們安裝和卸載包。我們可以指定版本,運行 pip freeze > requirements.txt 來輸出一個已安裝包列表到一個文本文件,還可以用相同的文本文件配合 pip install -r requirements.txt 來安裝一個應用程序需要的所有包。

但是 pip 並沒有包含將軟件包彼此隔離的方法。我們可能會開發使用相同庫的不同版本的應用程序,因此我們需要一種方法來實現這一點。隨之而來的是虛擬環境,它使我們能夠爲我們開發的每個應用程序創建一個小型的、隔離的環境。我們已經看到了許多管理虛擬環境的工具:virtualenv、 venv、 virtualenvwrapper、 pyenv、 pyenv-virtualenv、 pyenv-virtualenvwrapper 等等。它們都可以很好地使用 pip 和 requirements.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,通過爲你管理對不同環境的依賴關係,可以避免這些問題。該命令將安裝主項目依賴項:

Python

 

1

pipenv install

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

Python

 

1

pipenv install --dev

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

使用 Pipenv

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

Python

 

1

pip install pipenv

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

Python

 

1

pipenv install django

你會看到一些輸出,表明 Pipenv 正在爲你的項目創建一個 Pipfile

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

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

爲了生成 Pipfile.lock 文件,運行:

Python

 

1

pipenv lock

你也可以使用 Pipenv 運行 Python 腳本。運行名爲 hello.py 的上層 Python 腳本:

Python

 

1

pipenv run python hello.py

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

啓動一個 shell,運行:

Python

 

1

pipenv shell

如果你想將當前使用 requirements.txt 文件的項目轉換爲使用 Pipenv,請安裝 Pipenv 並運行:

Python

 

1

pipenv install requirements.txt

這將創建一個 Pipfile 並安裝指定的 requirements.txt。考慮一下升級你的項目!

瞭解更多

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章