本文最先发布与我的博客: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
环境算法
文档shell
--python=
参数来区分python版本(再也不使用pyenv,减小包依赖)。而pipenv的思路简单理解即是把pip和virutalenv 2个工具统一块儿来,使用 pipenv
来代替。pipenv
使用 Pipfile 来代替 requirement.txt 文件记录python包。Pipfile.lock
文件来锁定python软件的包名及版本,以及其依赖关系的列表。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 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算法将包的名称和版本,及依赖关系生成哈希值,能够保证包的完整性。
安装 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在构建新的虚拟环境时,若没有会自动下载安装。
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的包和版本的管理。时间有限,以上列举的仅为部分功能,更多的强大功能详见官方文档。