為什麼 Python 開發人員應該使用 Pipenv
只用了一年, 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
,透過為你管理對不同環境的依賴關係,可以避免這些問題。該命令將安裝主專案依賴項:
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中國 榮譽推出
相關文章
- Python 集合是什麼,為什麼應該使用以及如何使用?Python
- 什麼是Web開發?如何成為一個Python Web開發人員?WebPython
- 淺談DAST,什麼是DAST,開發人員為什麼要使用它?AST
- [譯] 為什麼你應該開始使用 KotlinKotlin
- 為什麼開發者應該摒棄敏捷?敏捷
- 為什麼開發人員喜歡低程式碼?
- 為什麼阿里巴巴禁止開發人員使用isSuccess作為變數名阿里變數
- 開發人員應該害怕低程式碼嗎?
- 為什麼你應該在專案中使用pyenv+Pipenv:為專案設定超棒的本地開發工作流之祕籍
- 什麼是DevSecOps?開發人員如何為安全而左移dev
- 為什麼開發人員痴迷於“關注點分離”?
- 為什麼安全是Java開發人員的首要任務?Java
- 為什麼Python停止執行?該如何應對?Python
- 每個JavaScript開發人員都應該瞭解UnicodeJavaScriptUnicode
- 為什麼 Web 開發人員需要學習一個 JavaScript 框架?WebJavaScript框架
- 為什麼開發人員必須要了解資料庫鎖?資料庫
- Grafana 系列文章(十):為什麼應該使用 LokiGrafanaLoki
- 新幹貨:開發人員都應該知道的CLI命令
- 每個開發人員都應該知道的WebSockets知識Web
- Android開發人員應該知道的一些技術Android
- 為什麼那麼多零基礎人員學習Python?Python
- 為什麼說web前端開發人員的薪資高、待遇好Web前端
- 為什麼Web開發人員在2020年不用最新的CSS功能WebCSS
- 職場人員該學什麼程式語言
- 使用Python分析大量資料應該學些什麼?Python
- 以就業為目標,Python到底應該學什麼?就業Python
- 2019 年,React 開發人員應該掌握的 22 種神奇工具React
- [譯] 為什麼每個 Android 開發者都應該嘗試 FlutterAndroidFlutter
- 獨立開發該做什麼,該不做什麼
- 為什麼網路安全防禦人員應該擁有網路攻擊者的思考方式
- 為什麼銷售人員需要CRM?
- python - pipenv 使用概覽Python
- 為什麼使用PythonPython
- 2020年,為什麼我們應該使用abapGit代替SAPLinkGit
- [譯] 為什麼你應該停止使用 Git rebase 命令Git
- 每個開發人員都應該知道的 10 個 GitHub 倉庫Github
- 為什麼銷售人員要使用CRM的四個理由?
- 應該使用什麼 CI/CD 工具?