pipenv 更优雅的管理你的python开发环境

本文最先发布与我的博客:http://www.pylixm.cchtml

最近常看到pipenv这个管理工具,今天有时间查了下,是 Kennethreitz 大神的做品,看了下github的仓库,是2017年1月份建立的,仅仅一年的时间变得到了7k+的收藏,最新一次的提交时间为2天前,可见该仓库活跃程度。本身以前写过一篇文章《使用 pyenv + virtualenv 打造多版本python开发环境》,遗留个问题,一直没有找到合理的同时管理python和python依赖包的工具,试用了下 pipenv,能够说完美的解决了python版本及包的管理问题。而且pipebv 仍是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

文档算法

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 直接安装。shell

pip install pipenv

做者推荐在python3下边安装,会提升与virtualenv的兼容性。npm

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库产生影响,可以使用此种方案安装。flask

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

pipenv 使用

初始化虚拟环境

执行pipenv install,建立虚拟环境,以下:composer

~/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的包和版本的管理。
  • 并对包之间的依赖关系也管理起来,方便了开发者构建本身的开发运行环境。

时间有限,以上列举的仅为部分功能,更多的强大功能详见官方文档

参考

图片描述

相关文章
相关标签/搜索