pipenv是一个python打包工具,它使用pip、virtualenv 和 requirements.txt 解决一些与典型工作流相关的常见问题。
pipenv 是python官方推荐的包管理工具。
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的处理逻辑:
如果安装的package_c的版本不符合后面的要求(package_b要求package_c<=2.0),则本次安装失败。
解决方法是在requiremts.txt中指定一个正确的范围,来解决冲突:
package_c>=1.0,<=2.0
package_a
package_b
问题依然是,依靠手动指定范围,当发生变化,也需要手动去改requirements.txt。很多时候子依赖的变化是你不知道的。理想状态是工具可以自动去处理这些子依赖的版本需求。
安装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会尝试安装所有满足要求的子依赖,如果遇到冲突(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文件的语法是TOML
理想情况下,pipfile中不会有子依赖,只需要有正常的import和use的包,pipenv会自动安装子依赖。pipfile应该传达的是顶级依赖。
这个文件是锁定具体的版本。文件格式是json。这个文件是通过pipenv lock自动生成的,不需要手动修改。
pipenv uninstall numpy
从虚拟环境中删除所有:
pipenv uninstall --all
删除开发环境所有包:
pipenv uninstall --all-dev
SOME_ENV_CONFIG=some_value
SOME_OTHER_ENV_CONFIG=some_other_value
当你使用 pipenv shell打开虚拟环境的时候,会从.env加载环境变量
找环境变量:
pipenv --venv
找项目目录:
pipenv --where
当执行pipenv install时,会自动检测requirements.txt并且转成Pipfile。
原文:https://realpython.com/pipenv-guide/#problems-that-pipenv-solves