Python 包管理工具 pipenv 构建虚拟环境
又一
Python虚拟环境和包管理工具,requests的作者Kenneth Reitz的作品,相当于virtualenv和pip的合体,解决requirements.txt的不确定构建问题。
为什么使用 pipenv
requirements.txt依赖管理存在局限。
当我们通过 pip install -r requirements.txt 安装依赖模块时,会默认安装最新的版本,但如果你的库有存在不兼容旧版本的接口时,代码在新的环境下就不能运行了。这就是不确定构建。
- 依赖关系的复杂性
当我们的项目使用了包 A,它依赖于包 B 的 2.x 系列,这时候 requirements.txt 会长这样:
1 | A==1.0 |
当我们需要使用包 C,而它依赖于 B 的 3.0 的 API,在这种情况下 pip install C 就会变成:
1 | A==1.0 |
这时候 A 很可能就没办法使用。而通过 Pipfile.lock 的确定构建就可以解决这个问题。
自己的使用感受是,相对于 virtualenv, 启动和使用更加方便。
因为 virtualenv 的项目和虚拟环境是分开管理的,在使用 virtualenv 一段时间以后,就可能分不清哪个项目对应哪个虚拟环境,而使用 pipenv 就不用关心这个问题,直接在项目下 pipenv shell 就搞定了。
但为保证包的完整性,加入到 Pipfile 的操作就比较耗时间。
安装 pipenv
1 | pip3 install pipenv |
创建虚拟环境
1 | mkdir project |
初始化好虚拟环境后,会在项目目录下生成 2个 文件 Pipfile 和 Pipfile.lock。为 pipenv 包的配置文件,代替原来的 requirement.txt。
项目提交时,可将 Pipfile 文件和 Pipfile.lock 文件一并提交,待其他开发克隆下载,根据此 Pipfile 运行命令 pipenv install --dev 生成自己的虚拟环境。
Pipfile.lock 文件是通过 hash 算法将包的名称和版本,及依赖关系生成哈希值,可以保证包的完整性。
激活虚拟环境
1 | pipenv shell |
pipenv 很智能,如果你进入了一个项目文件没有安装虚拟环境,直接启动虚拟环境,那么它会新建一个虚拟环境。
也就是说,创建过程是可以直接省略的。
退出虚拟环境
1 | exit |
安装/卸载包
安装相关模块并加入到 Pipfile
1 | pipenv install xxx |
查看安装包依赖关系
1 | pipenv graph |
查看虚拟环境安装目录
1 | pipenv --venv |
显示目录信息
1 | pipenv --where |
生成 lockfile
1 | pipenv lock |
运行 Python 文件
1 | pipenv run python xxx.py |
删除虚拟环境
1 | pipenv --rm |