本文最早釋出與個人部落格: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
文件
- github倉庫地址:pipenv
- pipenv 官方文件
pipenv 基本概念理解
- 之前我們使用pip + virtualenv 來管理python依賴包,使用
--python=
引數來區分python版本(不再使用pyenv,減少包依賴)。而pipenv的思路簡單理解便是把pip和virutalenv 2個工具統一起來,使用pipenv
來代替。 pipenv
使用 Pipfile 來代替 requirement.txt 檔案記錄python包。- 增加了
Pipfile.lock
檔案來鎖定python軟體的包名及版本,以及其依賴關係的列表。 - 它參考了其他語言的包管理工具(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個檔案Pipfile
和Pipfile.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的包和版本的管理。- 並對包之間的依賴關係也管理起來,方便了開發者構建自己的開發執行環境。
時間有限,以上列舉的僅為部分功能,更多的強大功能詳見官方文件。