pipenv 更優雅的管理你的python開發環境

碼農吳先生發表於2018-01-15

本文最早釋出與個人部落格:www.pylixm.cc

最近常看到pipenv這個管理工具,今天有時間查了下,是 Kennethreitz 大神的作品,看了下github的倉庫,是2017年1月份建立的,僅僅一年的時間變獲得了7k+的收藏,最新一次的提交時間為2天前,可見該倉庫活躍程度。自己之前寫過一篇文章《使用 pyenv + virtualenv 打造多版本python開發環境》,遺留個問題,一直沒有找到合理的同時管理python和python依賴包的工具,試用了下 pipenv,可以說完美的解決了python版本及包的管理問題。並且pipenv 還是Python.org正式推薦的python包管理工具。原文如下:

Pipenv — the officially recommended Python packaging tool from Python.org, free (as in freedom).

那麼接下來,分享下我的試用過程,供大家參考:

準備工作

試用環境及相關文件

環境

  • pipenv 9.0.1
  • python3.6
  • python2.7

文件

pipenv 基本概念理解

  1. 之前我們使用pip + virtualenv 來管理python依賴包,使用 --python=引數來區分python版本(不再使用pyenv,減少包依賴)。而pipenv的思路簡單理解便是把pip和virutalenv 2個工具統一起來,使用 pipenv 來代替。
  2. pipenv 使用 Pipfile 來代替 requirement.txt 檔案記錄python包。
  3. 增加了Pipfile.lock 檔案來鎖定python軟體的包名及版本,以及其依賴關係的列表。
  4. 它參考了其他語言的包管理工具(bundler, composer, npm, cargo, yarn, etc.),旨在將最好的包管理工具帶入python世界。

pipenv 功能試用

pipenv 安裝

普通安裝

pipenv 可使用 pip 直接安裝。

pip install pipenv 
複製程式碼

作者推薦在python3下邊安裝,會提高與virtualenv的相容性。

The use of Python 3 is highly preferred over Python 2, when installing Pipenv. Compatibility with three virtualenvs is greatly improved when using Python 3 as the installation target.

—Kenneth Reitz
複製程式碼

使用者模式安裝

為防止和系統python庫產生影響,可使用此種方案安裝。

pip install --user pipenv
複製程式碼

pip 預設安裝包路徑為/usr/local/lib/python2.7/site-packages。此模式下,pip安裝包儲存路徑為使用者庫路徑,一般為/Users/pylixm/Library/Python/3.6/lib/python/site-packages, 可使用命令python3 -m site --user-site 具體檢視。如果在安裝後你的shell中pipenv不可用,你需要把使用者庫的二進位制目錄/Users/pylixm/Library/Python/3.6/bin新增到你的PATH中。

pipenv 使用

初始化虛擬環境

執行pipenv install,建立虛擬環境,如下:

~/laboratory/pip_test_project ⌚ 20:42:10
$ pipenv install
Creating a virtualenv for this project…
⠋New python executable in /Users/pylixm/.local/share/virtualenvs/pip_test_project-MXA0TC90/bin/python2.7
Also creating executable in /Users/pylixm/.local/share/virtualenvs/pip_test_project-MXA0TC90/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/pylixm/.local/share/virtualenvs/pip_test_project-MXA0TC90
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (c23e27)!
Installing dependencies from Pipfile.lock (c23e27)…
  ?   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run the following:
 $ pipenv shell
複製程式碼

從列印資訊可見,它在目錄使用者目錄.local下建立了個和專案同名的虛擬環境(可通過配置環境變數來自定義虛擬環境目錄,export WORKON_HOME=~/.venvs),python使用的是預設的python2.7 。 可通過引數--two--three 來泛指python版本,也可通過--python 3.5 來明確知道python版本,但是這些引數的前提是你係統上有此python版本,否則會報如下錯誤:

$ pipenv --python 3.5
Warning: Python 3.5 was not found on your system…
You can specify specific versions of Python with:
  $ pipenv --python path/to/python

複製程式碼

有點像 virtualenv 的 --python引數。

初始化好虛擬環境後,會在專案目錄下生成2個檔案PipfilePipfile.lock。為pipenv包的配置檔案,代替原來的 requirement.txt。專案提交時,可將Pipfile 檔案和Pipfile.lock檔案受控提交,待其他開發克隆下載,根據此Pipfile 執行命令pipenv install [--dev]生成自己的虛擬環境。

Pipfile.lock 檔案是通過hash演算法將包的名稱和版本,及依賴關係生成雜湊值,可以保證包的完整性。

安裝python模組

正常安裝

安裝 requests 模組:

$ pipenv install requests
Installing requests…
Collecting requests
  Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached certifi-2017.11.5-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests)
  Using cached idna-2.6-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests)
  Using cached urllib3-1.22-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Using cached chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: certifi, idna, urllib3, chardet, requests
Successfully installed certifi-2017.11.5 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22

Adding requests to Pipfile's [packages]…
  PS: You have excellent taste! ✨ ? ✨
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (2f8679)! 
複製程式碼

可通過命令pipenv graph 檢視已安裝模組,同時可檢視他們直接的相互依賴情況。

$ pipenv graph
requests==2.18.4
  - certifi [required: >=2017.4.17, installed: 2017.11.5]
  - chardet [required: <3.1.0,>=3.0.2, installed: 3.0.4]
  - idna [required: >=2.5,<2.7, installed: 2.6]
  - urllib3 [required: >=1.21.1,<1.23, installed: 1.22]
複製程式碼
只安裝開發環境

可通過以下命令,僅安裝在開發環境,

pipenv install --dev requests --three
複製程式碼

區別反映在Pipfile 上為:

[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[dev-packages]


[packages]

requests = "*"
flask = "==0.10"

[requires]
python_version = "3.6"

複製程式碼

安裝包記錄是在[dev-packages] 部分,還是[packages] 部分。在安裝時,指定--dev引數,則只安裝[dev-packages]下的包,若安裝時不定指定--dev引數,只會安裝[packages] 包下面的模組。

[requires] 下的python在構建新的虛擬環境時,若沒有會自動下載安裝。

通過 requirements.txt 安裝
pipenv install -r requirements.txt
複製程式碼

這樣我們可以重用之前的requirement.txt 檔案來構建我們新的開發環境,可以把我們的專案順利的遷到pipenv。

可通過以下命令生成requirements 檔案:

pipenv lock -r [--dev] > requirements.txt
複製程式碼

執行虛擬環境

可使用以下命令來執行專案:

pipenv run python xxx.py
複製程式碼

或者啟動虛擬環境的shell環境:

~/laboratory/pip_test_project
$ pipenv shell --anyway
Spawning environment shell (/bin/zsh). Use 'exit' to leave.
source /Users/pylixm/.local/share/virtualenvs/pip_test_project-MXA0TC90/bin/activate

~/laboratory/pip_test_project 
$ source /Users/pylixm/.local/share/virtualenvs/pip_test_project-MXA0TC90/bin/activate
(pip_test_project-MXA0TC90)
~/laboratory/pip_test_project
$ exit

~/laboratory/pip_test_project
$ pipenv shell
Shell for UNKNOWN_VIRTUAL_ENVIRONMENT already activated.
No action taken to avoid nested environments.

複製程式碼

直接執行pipenv shell 並不會出現shell命令列,是應為沒有配置環境變數。還需要進一步研究,貌似需要配置環境變了,一直沒找到。

pipenv 提供了.env 檔案,放在專案目錄下,提供專案所需的環境變數,執行pipenv shell 時,會自動載入。

刪除虛擬環境及包

刪除包:

pipenv uninstall reuqests
複製程式碼

刪除虛擬環境:

pipenv --rm 
複製程式碼

總結

  • pipenv 完美的解決了python的包和版本的管理。
  • 並對包之間的依賴關係也管理起來,方便了開發者構建自己的開發執行環境。

時間有限,以上列舉的僅為部分功能,更多的強大功能詳見官方文件

參考

pipenv 更優雅的管理你的python開發環境

相關文章