Pipenv:新一代Python專案環境與依賴管理工具

greylihui發表於2019-03-03

什麼是Pipenv

Pipenv是Kenneth Reitz在2017年1月釋出的Python依賴管理工具,現在由PyPA維護。你可以把它看做是pip和virtualenv的組合體,而它基於的Pipfile則用來替代舊的依賴記錄方式(requirements.txt)。
在這篇文章裡,我將會以舊的依賴管理工作流程作為對比來介紹Pipenv的基本用法,更詳細的用法可以參考Pipenv文件,或是Kenneth Reitz在PyCon 2018的演講《Pipenv: The Future of Python Dependency Management》
順便說一句,我的還沒上市的《Flask Web開發實戰》中所有示例程式都使用了Pipenv進行依賴管理。
提示 如果你對virtualenv的用法以及虛擬環境的概念不熟悉的話,可以通過專欄的舊文《Flask出發之旅》進行簡單的認識。

為什麼使用Pipenv

Pipenv會自動幫你管理虛擬環境和依賴檔案,並且提供了一系列命令和選項來幫助你實現各種依賴和環境管理相關的操作。簡而言之,它更方便、完善和安全。你可以通過Pipenv文件開頭的介紹來了解它的詳細特性。Pipenv的slogan是“Python Dev Workflow for Humans”,作為人類,當然應該嘗試一下……

如何使用Pipenv

假設我們要編寫一個部落格程式,專案的依賴是Flask和Flask-WTF。順便說一句,可以使用下面的命令安裝Pipenv:
$ pip install pipenv複製程式碼
下面我會通過不同操作來給出所需命令的對比,OLD(舊)表示使用pip和virtualenv,NEW(新)表示使用Pipenv。
建立虛擬環境
  • OLD
$ virtualenv venv 複製程式碼
提示 這裡的venv是虛擬環境目錄的名稱,你可以自由更改,這會在你的專案根目錄建立一個venv資料夾,其中包含獨立的Python直譯器環境。
  • NEW
$ pipenv install複製程式碼
Pipenv會自動為你建立虛擬環境,自動生成一個隨機的虛擬環境目錄名。
啟用虛擬環境
  • OLD
在Linux或macOS系統中:
$ . venv/bin/activate複製程式碼
Windows:
> venvScriptsactivate複製程式碼
  • NEW
$ pipenv shell複製程式碼
此外,Pipenv還提供了一個pipenv run命令,在該命令後附加的引數會直接作為命令在虛擬環境中執行,這允許你不必顯式的啟用虛擬環境即可在虛擬環境中執行命令。比如,pipenv run python會啟動虛擬環境中的Python直譯器。
安裝依賴到虛擬環境
  • OLD
$ . venv/bin/activate  # 需要先啟用虛擬環境
(venv)$ pip install flask flask-wtf  複製程式碼
  • NEW
使用Pipenv,不管你是否啟用了虛擬環境,都可以通過pipenv install命令安裝:
$ pipenv install flask flask-wtf  複製程式碼
事實上,對一個新專案來說,你不必手動使用pipenv install來建立虛擬環境。當使用pipenv install xxx直接安裝依賴包時,如果當前目錄不包含虛擬環境,Pipenv會自動建立一個。
記錄依賴
  • OLD
(venv)$ pip freeze > requirements.txt複製程式碼
這個命令會把依賴列表寫入requirements.txt檔案。每當你安裝或解除安裝了依賴包時,都需要手動更新這個檔案。你必須保持謹慎,否則非常容易把依賴列表弄亂。
  • NEW
使用Pipenv時,什麼都不必做,Pipenv會自動幫你管理依賴。Pipenv會在你建立虛擬環境時自動建立Pipfile和Pipfile.lock檔案(如果不存在),並且會在你使用pipenv install和pipenv uninstall命令安裝和解除安裝包時自動更新Pipfile和Pipfile.lock。
附註 Pipfile用來記錄專案依賴包列表,而Pipfile.lock記錄了固定版本的詳細依賴包列表。
在部署環境安裝依賴
  • OLD
當我們需要在一個新的環境,比如部署上線環境安裝所有依賴時,我們需要重複上面的多條命令:
$ virtualenv venv  # 建立虛擬環境
$ . venv/bin/activate  # 啟用虛擬環境
(venv)$ pip install -r requirements.txt  # 安裝requirement.txt中記錄的依賴複製程式碼
  • NEW
使用Pipenv則只需要執行pipenv install,它會自動安裝Pipfile中記錄的依賴:
$ pipenv install複製程式碼
區分開發依賴
  • OLD
使用requirements.txt時,我們通過會單獨建立一個requirements-dev.txt檔案來手動加入開發依賴。比如專案開發時才會用到pytest,那麼你需要手動建立這個檔案,然後寫入:
-r requirements.txt
pytest==1.2.3複製程式碼
在新的開發環境安裝依賴時,你需要安裝這個檔案中的依賴:
(venv)$ pip install -r requirements-dev.txt複製程式碼
  • NEW
使用Pipenv時,你只需要在安裝pytest時新增一個–dev選項,它會自動被分類為開發依賴(寫入Pipfile的dev-packages一節中):
$ pipenv install pytest --dev複製程式碼
在新的開發環境安裝依賴時,也只需要在pipenv install命令後新增–dev選項即可一併安裝開發依賴:
$ pipenv install --dev複製程式碼

總結

為了讓你更輕鬆的過渡,Pipenv甚至提供了讀取和生成requirements.txt檔案的功能(在使用pipenv install命令時它會自動讀取requirements.txt檔案安裝依賴並生成Pipfile檔案)。希望這篇文章可以讓你更快的上手Pipenv。

Q&A

Q:安裝Python包太慢?
A:Pipenv本身就是基於Pip,所以也可以更換PyPI源。只需要在Pipfile中更換對應的url即可。比如,下面的Pipfile使用阿里雲提供的映象源:
[[source]]

url = "https://mirrors.aliyun.com/pypi/simple"
verify_ssl = true
name = "pypi"複製程式碼
Q:生成Pipfile.lock太慢?
A:不像npm等依賴管理工具(依賴通過純文字定義),對於Python包,如果你要獲取詳細的依賴情況,需要下載安裝包並執行setup.py檔案,所以會耗費一定時間。通常來說,更換PyPI源已經可以大幅提升速度。如果你仍然不想等待生成Pipfile.lock的時間,那麼可以在執行pipenv install命令時新增–skip-lock選項來跳過lock步驟,最後使用pipenv lock命令來統一執行lock操作。
Q:自定義虛擬環境資料夾路徑
A:預設情況下,Pipenv會自動為你選擇虛擬環境的儲存位置,在Windows下通常為C:UsersAdministrator.virtualenvs,而Linux或macOS則為~/.local/share/virtualenvs/。如果你想將虛擬環境資料夾在專案目錄內建立,可以設定環境變數PIPENV_VENV_IN_PROJECT,這時名為.venv的虛擬環境資料夾將在專案根目錄被建立。另外你也可以通過WORKON_HOME環境變數來自定義儲存路徑。

相關文章