Pipenv:新一代Python項目環境與依賴管理工具

什麼是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:
> venv\Scripts\activate複製代碼
  • 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:\Users\Administrator\.virtualenvs\,而Linux或macOS則爲~/.local/share/virtualenvs/。若是你想將虛擬環境文件夾在項目目錄內建立,能夠設置環境變量PIPENV_VENV_IN_PROJECT,這時名爲.venv的虛擬環境文件夾將在項目根目錄被建立。另外你也能夠經過WORKON_HOME環境變量來自定義存儲路徑。
相關文章
相關標籤/搜索