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

本文最先發布與我的博客:www.pylixm.cchtml

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

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

那麼接下來,分享下個人試用過程,供你們參考:github

準備工做

試用環境及相關文檔

環境算法

  • pipenv 9.0.1
  • python3.6
  • python2.7

文檔shell

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 直接安裝。npm

pip install pipenv 
複製代碼

做者推薦在python3下邊安裝,會提升與virtualenv的兼容性。flask

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庫產生影響,可以使用此種方案安裝。bash

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中。composer

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的包和版本的管理。
  • 並對包之間的依賴關係也管理起來,方便了開發者構建本身的開發運行環境。

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

參考

相關文章
相關標籤/搜索