前言
刚才使用pipenv发现了一个bug,
顺手提了个的PR。无聊之下翻了下贡献者列表,貌似没有一个我国的开发者!我的普及工作任重而道远啊,我写篇文章给大家介绍下这个终极大杀器。
Python开发者应该听过pip、easy_install和virtualenv,如果看过我的书应该还知道
virtualenvwrapper、virtualenv-burrito和autoenv,再加上pyvenv、venv(Python
3标准库)、pyenv…
额,是不是有种发懵的感觉?
那么现在有个好消息,你可以只使用终极方案: pipenv + autoenv(可选)。
「终极方案」,听起来好噱头呀。给出我的理由之前我们先了解一下Python虚拟环境和包管理的历史吧。
历史
在Python发展史上出现了很多创建和发布包的工具。
当你想要把你的项目分享出去,放到PYPI或者其他托管服务上的时候,就需要借助这样的工具来构建和分发项目。早在1998年Python标准库内置了模块distutils,但是只提供了有限的支持,之后社区选择通过setuptools这个包实现构建和发布,它自带easy_install,能帮助你找到、下载、安装以及更新需要使用的包。不过依然功能很有限,比如不能删除包。
当你做一个专职的Python开发,独立的虚拟环境也是一个开发中迫切需要的功能,在这里请大家记住一个 Ian Bicking(下称ianb)
的开发者,08年,他开发了virtualenv。
社区一些Python核心开发者和知名项目(如Django)核心开发者也在支持和推动这件事,后来成立了pypa(Python Packaging
Authority),pypa早期做的就是pip - 现在最主流的安装包的工具。再提一下,ianb也是pip的早期核心开发者。
不过非常遗憾,由于和社区产生了一些矛盾,ianb很早之前就不再写Python项目(可见这矛盾多大呀
😮),virtualenv也转给了其他开发者,这是Python社区一个极大的损失。
现在pip和virtualenv已经被大家所熟知,甚至可以说是Python官方的包管理和虚拟环境选择。不过其实还是有问题,我举几个例子:
- 必须手动安装或删除某些特定版本的包,并记得定期更新requirements.txt文件,以保持项目环境的一致
- 有时项目中需要有多个requirements.txt文件,比如开发时应该用dev-requirements.txt,现有的模式不能满足这些复杂的需要
- 卸载包的时候只是卸载包自己,不能处理相关依赖,时间久了项目环境就混乱了
pipenv 是什么?
Pipenv 是 Python 项目的依赖管理器。其实它不是什么先进的理念和技术,如果你熟悉 Node.js 的 npm/yarn 或 Ruby 的
bundler,那么就非常好理解了,它在思路上与这些工具类似。尽管pip可以安装Python包,但仍推荐使用Pipenv,因为它是一种更高级的工具,可简化依赖关系管理的常见使用情况。
主要特性包含: - 根据 Pipfile 自动寻找项目根目录。
- 如果不存在,可以自动生成 Pipfile 和 Pipfile.lock。
- 自动在项目目录的 .venv 目录创建虚拟环境。(当然这个目录地址通过设置WORKON_HOME改变)
- 自动管理 Pipfile 新安装和删除的包。
- 自动更新 pip。
对于新手和老手来说都是更好的选择。pipenv 都包含什么?
pipenv 是 Pipfile 主要倡导者、requests 作者 Kenneth Reitz
写的一个命令行工具,主要包含了Pipfile、pip、click、requests和virtualenv。Pipfile和pipenv本来都是Kenneth
Reitz的个人项目,后来贡献给了pypa组织。Pipfile是社区拟定的依赖管理文件,用于替代过于简陋的 requirements.txt 文件。
Pipfile的基本理念是: - Pipfile 文件是 TOML 格式而不是 requirements.txt 这样的纯文本。
- 一个项目对应一个 Pipfile,支持开发环境与正式环境区分。默认提供 default 和 development 区分。
- 提供版本锁支持,存为 Pipfile.lock。
click是Flask作者 Armin Ronacher 写的命令行库,现在Flask已经集成了它。
接下来,我们看看怎么使用它吧入门
pipenv兼容Python 2/3,我们这里以Mac下Python 3为例:安装pipenv
1 |
|
使用pipenv
用一个空目录体验一下:
1 |
|
以上就是原来virtualenv的基本用法了。我们看一下当前目录现在是什么样子的:
1 |
|
这个环境下目前什么都没有。我们安装2个包:
1 |
|
现在Pipfile.lock已经更新了,包含了 elasticsearch-dsl、requests 和相关依赖的包信息。
另外如果你添加–two或–three标志到上面的最后一个命令,它分别使用Python 2或3来初始化你的项目。 否则将使用默认版本的Python。
可以看一下依赖关系:
1 |
|
可以看到,他俩都依赖了urllib3。虽然现在pipenv不能直接卸载包及其依赖,但是由于它提供了良好的接口,我们还是可以实现:
1 |
|
其中depends.py脚本会解析依赖关系,排除其他包依赖的项目然后删除:
1 |
|
再看一下现在环境中的包依赖关系:
1 |
|
是不是很干净呢?
其他功能
除了上述基本功能以外,pipenv还有很多附加的功能,我举几个日常比较常用的例子:
1 |
|
另外由于autoenv也是Kenneth Reitz写的,所以pipenv默认也包含了对.env文件的支持。
是不是方便很多呢?
版权声明:本文由 董伟明 原创,未经作者授权禁止任何微信公众号和向掘金(juejin.im)转载,技术博客转载采用 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议
python