当前位置: 首页 > 工具软件 > Pipenv > 使用案例 >

python 依赖管理 pipenv

邢冷勋
2023-12-01

pipenv

pipenv是一个python打包工具,它使用pip、virtualenv 和 requirements.txt 解决一些与典型工作流相关的常见问题。

pipenv 是python官方推荐的包管理工具。

使用requirements.txt文件做依赖管理,子依赖更新问题

requirements.txt

flask

由于没有指定flask版本,使用pip install -r requirements.txt会安装最新版本。

指定版本:

flask=0.12.1

flask有自己的依赖,requirements.txt没有指定flask的依赖的版本

执行pip freeze得到的结果,复制到requirements.txt中。就可以保证通过requirements.txt安装的依赖和目前的开发环境一致。

pip freeze命令可以获取所有第三方库的具体版本,包括pip install 自动安装的子依赖。

这种方式,当有依赖的版本需要更新时,只能手动去更新requirements.txt中的版本号。即使是子依赖更新了。

使用pipenv可以解决自动更新子依赖的问题。

不同的项目,依赖版本不一样的问题

使用virtual environment(vitualenv 或 python3里叫做venv),它有自己的python可执行文件和第三方包存储。这样就可以分离不同的项目。

pipenv内置virtual environment,所以只需要pipenv一个工具就够了

依赖解析问题

假如有这样一个requirements.txt文件:

package_a
package_b

package_a有子依赖package_c,且package_c版本要求:package_c>=1.0
package_b也有子依赖package_c,但package_b的子依赖package_c要求版本:package_c<=2.0.

理想的情况就是:安装工具会找package_c(>=1.0 and <=2.0),选一个条件都满足的版本。你会希望工具去解决这个依赖问题,这就是依赖解析

pip本身不会去解决这个问题。pip的处理逻辑:

  1. 安装package_a,查找满足第一个要求的package_c(package_c>=1.0)
  2. pip然后安装符合要求的最新版本的package_c。如最新版本是package_c 3.1。

如果安装的package_c的版本不符合后面的要求(package_b要求package_c<=2.0),则本次安装失败。

解决方法是在requiremts.txt中指定一个正确的范围,来解决冲突:

package_c>=1.0,<=2.0
package_a
package_b

问题依然是,依靠手动指定范围,当发生变化,也需要手动去改requirements.txt。很多时候子依赖的变化是你不知道的。理想状态是工具可以自动去处理这些子依赖的版本需求。

pipenv解决以上问题

安装pipenv

pip install pipenv

一旦安装的pipenv,就可以忘记pip了,本质上pipenv是pip的替代品。

安装好后,会产生2个文件,Pipfile(替代requirements.txt)和Pipfile.lock

使用

首先在虚拟环境中生成一个shell来隔离应用程序的开发。

pipenv shell

这会创建一个虚拟环境。pipenv会在一个默认的位置创建虚拟环境。如果要改变默认位置参考:配置环境变量

如果要指定python版本:–python 版本号

pipenv shell --python 3.6

然后就可以安装第三方依赖:

pipenv install flask==0.12.1

还可以直接从VCS(version control system)安装一个依赖:

pipenv install -e git+https://github.com/requests/requests.git#egg=requests

只在开发环境安装,生产环境不需要的:–dev

pipenv install pytest --dev

需要push到开发环境,需要锁定你的环境来保证一致:

pipenv lock

这会创建或更新Pipfile.lock。这个文件是自动生成,不需要手动更改。

然后在开发环境安装:

pipenv install --ignore-pipfile

–ignore-pipfile告诉pipenv忽略pipfile,使用pipfile.lock来安装。

现在如果另一个开发者要使用和你同样的环境:

pipenv install --dev

这会安装所有依赖,包括指定–dev的

pipenv 的依赖解析方法

pipenv会尝试安装所有满足要求的子依赖,如果遇到冲突(package_a需要package_c>=1.0,package_b需要package_c<1.0),pipenv不会创建lock文件,并且输出以下错误信息:

Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
Could not find a version that matches package_c>=1.0,package_c<1.0

按照提示所说,pipenv graph会显示依赖图,可以查看整个顶级依赖和其子依赖。

反转显示树,显示子依赖和其父依赖,在查找冲突时可能有用:

pipenv graph --reverse
Pipfile

Pipfile文件的语法是TOML

理想情况下,pipfile中不会有子依赖,只需要有正常的import和use的包,pipenv会自动安装子依赖。pipfile应该传达的是顶级依赖。

Pipfile.lock

这个文件是锁定具体的版本。文件格式是json。这个文件是通过pipenv lock自动生成的,不需要手动修改。

删除包
pipenv uninstall numpy

从虚拟环境中删除所有:

pipenv uninstall --all

删除开发环境所有包:

pipenv uninstall --all-dev
pipenv自动加载根目录下的.env文件里的环境变量
SOME_ENV_CONFIG=some_value
SOME_OTHER_ENV_CONFIG=some_other_value

当你使用 pipenv shell打开虚拟环境的时候,会从.env加载环境变量

找环境变量:

pipenv --venv

找项目目录:

pipenv --where
如果已经存在requirements.txt,怎么转成pipfile

当执行pipenv install时,会自动检测requirements.txt并且转成Pipfile。

参考:

原文:https://realpython.com/pipenv-guide/#problems-that-pipenv-solves

 类似资料: