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

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

來自專欄 Hello, Flask!

大家好,這是專欄恢復更新的第一篇文章。以後如果沒有意外的話,會每周更新一篇文章。

什麼是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.txtpytest==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 = truename = "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環境變數來自定義存儲路徑。

- - - - -

知乎專欄 Hello, Flask!


推薦閱讀:

pyhton新聞頁正文抽取
Python新手入門指導
為什麼可以像執行系統命令一樣執行 Python 的包,如 scrapy crawl xxx?
PyQt5系列教程(5):事件與信號處理
如何用爬蟲獲取網易雲音樂歌單中的歌曲?

TAG:Python | Flask | Web開發 |