pipenv 指北
依赖管理一直都在编程语言中占据着至关重要的地位,虽然不同编程语言的依赖管理工具不尽相同,但是 TA 们追求的目标都是大同小异的:能够对项目依赖进行更加轻松统一的管理,能够更加便捷的进行项目迁移和部署。
因此,就出现了 maven、composer、npm、pip 这些依赖包管理工具,但是,对比于 Java、PHP 和 Node.js,Python 在依赖管理方面更加特殊,不仅需要考虑项目依赖的第三方包,还要着重考虑虚拟环境。这一点,是由于 Python 和 Java、PHP、Node.js 这些编程语言本质上存在差异导致的。
Java、PHP、Node.js 是以项目进行隔离,每当开发一个项目,依赖包都是安装在项目工程路径下。每个工程相互之间是隔离的,这样,即便是不同工程用到同一个包的不同版本,它们之间也不会产生冲突。但是 Python 则不同,在 Python 中无法通过工程对依赖包进行隔离。
当使用 pip 安装第三方包时,所有的依赖都会安装到安装目录下的 site-packages。这样当不同的项目依赖同一个包的不同版本时就会产生冲突,同时只能存在一个版本的包。显然这是非常不友好的。
为了解决这个问题,虚拟环境就起到了至关重要的作用。在开发不同的工程时,可以创建并激活不同的虚拟环境。这样,不同的工程就会用到不同环境下的解析器,我们也可以把依赖包安装到不同虚拟环境的 site-packages 路径下。
因此,在 Python 中依赖管理一般指代依赖管理 + 虚拟环境。以往,Python 工程师针对Python 依赖管理和虚拟环境经常会用到 2 个工具:pip 和 virtualenv。pip 用于依赖包管理,virtualenv 用于虚拟环境管理。这样虽然解决了不同工程之间环境隔离的问题,但是也存在着明显的不足:
- 需要同时依赖 2 款管理工具
- 不能动态更新 requirements.txt
在工程开发过程中,需要一个配置文件来记录依赖包和环境参数,例如,maven 的 pom.xml、composer 的 composer.json 以及 npm 的 package.json。
因此,由 requests、flask 等知名工具包的作者 Kenneth Reitz 于 2017 年发布的一款 Python 依赖包管理工具 pipenv 就诞生了。
What
pipenv 是 Python 官方推荐的包管理工具,能够帮助我们不必建立虚拟环境的情况下非常容易地安装和管理依赖。可以说,它集成了 virtualenv、pip 和 pyenv 三者的功能于一身。其目的旨在集合了所有的包管理工具的长处,类似于: Node.js 的 npm、yarn, PHP 的 composer 等。
能够自动为项目创建和管理虚拟环境,从 Pipfile 文件添加或删除安装的包,同时生成 Pipfile.lock 来锁定安装包的版本和依赖信息,避免构建错误。同时兼容 requirements.txt 的包管理方式。
Why
pipenv 主要解决了如下问题
- 快速创建虚拟环境,不用再单独使用 pip 和 virtualenv, 现在它们合并在一起了
- 不用再维护 requirements.txt, 使用 Pipfile 和 Pipfile.lock 来代替
- 提供的 pipenv 替代 pip 并自带一个依赖清单 Pipfile,和依赖锁定 Pipfile.lock
- 可以使用多个 python 版本 (python2 和 python3)
- 安全。广泛地使用 Hash 校验,能够自动曝露安全漏洞
- 在安装了 pyenv 的条件下,可以自动安装需要的 Python 版本
- 随时查看图形化的依赖关系
- 通过加载 .env 文件简化开发流程
How
安装
brew install pipenv
pip install pipenv
常用命令
# 初始化虚拟环境
pipenv --python 2.7.16
pipenv --python 3
pipenv --python 3.7
# 安装项目依赖,当没有 Pipfile 时会自动从 requirements.txt 文件导入安装包信息并创建 Pipfile
pipenv install
# 激活当前项目虚拟环境
pipenv shell
# 安装依赖包
pipenv install urllib3
pipenv install pytest --dev
# 卸载安装包
pipenv uninstall urllib3
# 图形显示包依赖关系
pipenv graph
# 生成lockfile
pipenv lock
# 生成 requirements.txt 文件
pipenv lock -r
# 生成 dev-packages 的 requirements.txt 文件
pipenv lock -r -d
# 删除所有的安装包
pipenv uninstall --all
# 删除虚拟环境
pipenv --rm
pipenv run
pipenv 还准备了一个 run 命令,可以不用显示激活虚拟环境的情况下,用虚拟环境执行命令
pipenv run python main.py
如果不想每次运行 Python 时都输入这么多,可以在 shell 中设置一个别名,例如alias prp="pipenv run python"