Python 包管理及虚拟环境的应用(三: pipenv)
前两篇分别学习了 Python 如何进行依赖的管理,以及结合虚拟环境来使用
下面来体验体验
因为
Linux 下能也能通过
下面再简单分解说明
依赖安装后自动更新

要想干净的清除或许得
若要得到真实的依赖树,应该坚决的把虚拟环境删了,再生成,反正之前下载的依赖在本地有缓存的。命令如下

自定义的虚拟环境目录
假如在项目目录中创建一个
不显式激活虚拟环境直接用
链接:
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
pip 进行依赖管理。而有人觉得把 virtualenv 与 pip 分开来操作太麻烦了,而且 requirements.txt 描述依赖的方式十分笨拙,所以在前两者之上创建了 pipenv, 也谈不上重新发明了轮子吧。3. Pipenv: 新一代依赖管理与虚拟环境
倘若不是经由virtualenv, venv 而来到 pipenv,没有对比也就无法体会到 pipenv 的妙处的。pipenv 在总结了 virtualenv/venv 的缺点之后由 Kenneth Reitz 于 2017 年 1 月发布的新型 Python 依赖管理器。- 它不再需要单独用
virtualenv和pip,只要一条命令pipenv完成所有的事 - 不用手动管理
requirements.txt文件,而是由pipenv自动维护Pipfile和Pipfile.lock文件 - 自动创建虚拟环境,并且虚拟环境与项目文件分离
- 更详尽的依赖图(例如
pipenv graph),像mvn dependency:tree那样显示依赖树 - 控制台下输出颜色更丰富
下面来体验体验
pipenv 3.1 安装 pipenv
pip3 install pipenv --user安装完后如果直接执行
pipenv 命令,提示 pipenv 找不到,并且 pip3 也不能用了vagrant@ubuntu-bionic:~$ pip3这时候也许应该重启 shell 应用新的路径环境,因
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'
pip 安装的命令会放到 ~/.local/bin 目录中。看 ~/.profile 文件1# set PATH so it includes user's private bin if it exists
2if [ -d "$HOME/.local/bin" ] ; then
3 PATH="$HOME/.local/bin:$PATH"
4fi因为
pip 安装 pipenv 之前目录 /.local/bin 可能不存在,pipenv 安装之后在 /.local/bin 中多出了以下几个命令easy_install easy_install-3.6 pip pip3 pip3.6 pipenv pipenv-resolver virtualenv virtualenv-clone其中的
pip3 要替代 /usr/bin/pip3。重启 shell,pipenv 等命令将能使用。从 pipenv 所安装的命令也能看出 pipenv 实质是建筑在 virtualenv 和 pip 之上的壳。Linux 下能也能通过
Linuxbrew 来安装 pipenvsudo apt-get install linuxbrew-wrapperMac OS X 下也是用
brew install pipenv # 如果不能运行 pipenv 的话也考虑重启 shell 应用路径环境
brew install pipenv 安装。3.2 使用 pipenv
使用过程先以一张图片直观的展现出来
下面再简单分解说明3.2.1 创建虚拟环境
pipenv install自动创建虚拟环境,并生成
Pipfile 和 Pipfile.lock 文件。如果已有相对应的虚拟环境则检查 Pipfile 中是否有更新,有新的依赖则下载安装。3.2.2 激活虚拟环境
pipenv shell从上图中也是 source 了相应虚拟环境的
bin/activate 文件,因为底层就是一个 virtualenv。进到虚拟环境后,通过对 $VIRTUAL_ENV 或 pipenv --env 查看到它相对应的虚拟环境不在当前目录中,而是分离到了 ~/.local/share/virtualenvs/demo-PtmYtcbd/ 中,这也使得项目本身更干净了。3.2.3 安装依赖
pipenv install requests和创建虚拟环境类似,所以我们也可以一步到位的创建虚拟环境并安装指定的模块。由
sys.path 显示出的内容可知模块会安装到虚拟环境下的目录 ~/.local/share/virtualenvs/demo-PtmYtcbD/lib/python3.6/site-packages 下。依赖安装后自动更新
Pipfile 文件。我们也可以手工编辑该 Pipfile 文件,加入更多的依赖,保存后再次运行 pipenv install 即下载安装指定的依赖。3.2.4 显示依赖树
假设我们还用pipenv install boto3 安装了 boto3,显示依赖树用命令pipenv graph

3.2.5 移除依赖
pipenv uninstall boto3相当于执行了
pip uninstall boto3。这时候我们查看 Pipfile 文件确实是移到了 boto3 = "*" 这一行,并且 boto3 也从 ~/.local/share/virtualenvs/demo-PtmYtcbD/lib/python3.6/site-packages 中删掉了。但是它所依赖的包依旧在,所以再次显示依赖树变成下面的样子
要想干净的清除或许得 botocore, s3transfer, docutils ..... 逐个干掉,但不实际。pipenv graph 并非解析 Pipfile 生成的,而是扫描虚拟环境中的 site-packages 获得的。若要得到真实的依赖树,应该坚决的把虚拟环境删了,再生成,反正之前下载的依赖在本地有缓存的。命令如下
pipenv --rm
pipenv install
pipenv graph

3.2.6 退出虚拟环境
deactivate因为本质上在执行
pipenv shell 时就是 source 了虚拟环境的 bin/activate 文件,所以退出方式与 virtualenv 是一样的。也能用 exit, 有时候 exit 后不进行换行。3.2.7 其他功能
pipenv 支持不同的 Python 版本pipenv --two
pipenv --three
pipenv --python 2.7.14
pipenv --python path/to/python
pipenv 支持不同的代码环境,在 Pipfile 可以分组 [dev-packages], [packages] 分别指定不同的依赖,比如 dev 时才需要的测试相关的模块。安装依赖的时候可以用 pipenv install --dev,这很像 npm自定义的虚拟环境目录
假如在项目目录中创建一个
.venv 目录,那么运行 pipenv install 后虚拟环境就会创建到该 .venv 目录中,而不是在 ~.local/share/virtualenvs/ 目录下。
pipenv 支持 .evn 文件设定环境变量不显式激活虚拟环境直接用
pipenv 命令在虚拟环境中运行代码,如 pipenv run python test.py4. 结论
venv和virtualenv基本可看成是同一个东西,只是使用格式上的不同。通常情况下我们统称为virtualenvpipenv是pip与virtualenv的组合体,底层的实现仍然是后两者,所以使用pipenv最好对后两者要有一定的了解- 确实,最佳的虚拟环境选择顺序应该是
pipenv->venv(因为自带)->virtualenv。pipenv和virtualenv都能支持 Python 2 和 Python 3 - 研究了那么多依赖管理与虚拟环境,Python 还是没有一个比较趁手的分发打包工具。有时候不得不用最原始的 zip 命令
链接:
- Install packages using pip and virtualenv
- venv -- Creation of virtual environments
- An Introduction to Virtual Environments in Python
- Basic Usage of Pipenv
- Pipenv: 新一代Python项目环境与依赖管理工具
- Pipenv: Python Dev Workflow for Humans
- Kenneth Reitz - Pipenv: The Future of Python Dependency Management - PyCon 2018
- Advanced Usage of Pipenv
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。