Python多环境管理神器(pipenv)
pipenv
pipenv 是⼀款⽐较新的包管理⼯具,其借鉴了 javascript 的 npm 和 PHP 的 composer 等理念,通过⼀个依赖描述⽂件 Pipfile 来安装和管理依赖,以达到协同开发的⽬的。如果你熟悉 npm 或者 composer 的话,那 pipenv 正合你胃⼝。pipenv 其实整合了 pip 和 virtualenv 等库,在其上推出了更便捷的使⽤⽅式。
1、安装pipenv
直接使⽤pip命令安装
pip3 install pipenv
设置命令⾏的⾃动补全功能
如果使⽤的bash shell,请将以下代码添加到 .bashrc 或 .bash_profile ⽂件内:
eval "$(pipenv --completion)"
命令详解:
$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...
Options:
--where            输出项⽬根⽬录相关信息
--venv              输出virtualenv相关信息
--py                输出Python解释器相关信息
--envs              输出环境变量选项
--rm                删除virtualenv
--bare              最⼩化输出
--completion        命令⾃动补全
-
-man              显⽰man页⾯
--three / --two    在创建virtualenv时使⽤Python3或Python2
--python TEXT      指定创建virtualenv时使⽤的具体的Python版本
--site-packages    为virtualenv启⽤site-packages [env变量:PIPENV_SITE_PACKAGES]
--clear            清除缓存(pipenv,pip和pip-tools)[env变量:PIPENV_CLEAR]
--pypi-mirror TEXT  指定⼀个PyPI镜像
--version          显⽰版本信息并退出
-h, --help          显⽰帮助信息并退出
使⽤⽰例:
创建⼀个项⽬,并明确指定使⽤Python3.7:
$ pipenv --python 3.7
删除项⽬的virtualenv (inferred from current directory):
$ pipenv --rm
为项⽬安装所有依赖项 (including dev):
php软件安装包$ pipenv install --dev
创建包含pre-releases的lockfile⽂件:
$ pipenv lock --pre
将已安装的依赖项显⽰为图表:
$ pipenv graph
检查已安装的依赖项是否存在安全漏洞:
$ pipenv check
安装⼀个本地的setup.py到你的虚拟环境或Pipfile:
$ pipenv install -e .
使⽤原⽣的pip命令:
$ pipenv run pip freeze
Commands:
check      根据 Pipfile 中提供的PEP 508标记检查安全漏洞
clean      卸载所有 Pipfile.lock 未指定的包
graph      显⽰当前安装的依赖项的关系图信息
install    如果未指定要安装的包,则会安装 Pipfile 中的所有包,否则,只安装指定的包
lock      ⽣成 Pipfile.lock ⽂件
open      在编辑器中查看给定的模块
run        运⾏virtualenv中已安装的命令
shell      在virtualenv内启动⼀个shell
sync      安装 Pipfile.lock 中指定的所有的包
uninstall  卸载⼀个指定的包并将其从 Pipfile 中移除
update    先运⾏lock命令,在运⾏sync命令
2、pipenv虚拟环境管理
2.1、虚拟环境创建与激活
创建虚拟环境
# 进⼊项⽬⽬录:
[root@ops-130 data]# mkdir myproj10
[root@ops-130 data]# cd myproj10/
[root@ops-130 myproj10]# ls
[root@ops-130 myproj10]# pipenv install
上⾯的命令会⾃动在~/.local/share/virtualenvs/⽬录下创建虚拟环境⽬录,
名字为⼀个当前⽬录名加⼀串随机字符串的虚拟环境⽬录。这⾥是myproj10-740tHe3W
创建过程如下图:
下⾯多了两个⽂件,为Pipfile和Pipfile.lock,⽤于存放依赖包名的⽂件。
类似php⾥的composer.json和composer.lock。
[root@ops-130 myproj10]# ls
Pipfile  Pipfile.lock
查看虚拟环境
[root@ops-130 myproj10]# pipenv --venv
/root/.virtualenvs/myproj10-740tHe3W
我们的虚拟环境⽬录在/root/.virtualenvs/下⾯,是因为我们之前设置过环境变量
export WORKON_HOME=$HOME/.virtualenvs
激活虚拟环境:
cd /data/myproj10
pipenv shell
激活后如下图:
注意:上⾯激活虚拟环境的时候,出现了这么⼀个告警:
Warning: Your Pipfile requires python_version 2.7, but you are using 3.9.9 (/root/./m/bin/python).
原因:这是因为创建虚拟环境的时候,没有指定python解释器,Pipfile就使⽤系统默认的python解释器了,就是2.7.5,但是pipenv却是使⽤系统最新的解释器3.9.
解决办法:
办法⼀:⼿动修改Pipfile
⼿动修改Pipfile⽂件⾥的python_version
注意:Pipfile.lock⾥的也要修改
vim Pipfile
[[source]]
url = "/simple"
verify_ssl = true
name = "pypi"
[packages]
[dev-packages]
[requires]
python_version = "3.9"
办法⼆:删除虚拟环境,重新创建虚拟环境
删除虚拟环境后,再次安装会覆盖之前的Pipfile,使⽤新环境。如果不删除,⽆法覆盖。
# pipenv --rm删除当前虚拟环境,注意Pipfile不会被删掉
[root@ops-130 myproj10]# pipenv --rm
# 使⽤pipenv重新安装,指定解释器版本为3.X
[root@ops-130 myproj10]# pipenv install --three
# 此时再次查看Pipfile版本就和环境⼀致了。
[root@ops-130 myproj10]# cat Pipfile
如下图:
退出虚拟环境:exit
((myproj10) ) [root@ops-130 myproj10]# exit
exit
[root@ops-130 myproj10]#
刚创建好虚拟环境的时候,会⾃动进⼊虚拟环境,并且此时是没有前缀显⽰,此时需要⽤exit退出。当后⾯⽤pipenv shell激活的时候,会显⽰前缀,此时可以⽤exit退出,也可以使⽤deactivate退出。删除虚拟环境
[root@ops-130 myproj10]# pipenv --rm
Removing virtualenv (/root/.virtualenvs/myproj10-740tHe3W)...
2.2、创建虚拟环境的多种⽅式
pipenv创建虚拟环境有多种⽅式,这⾥总结⼀下:
⽅式⼀:指定解释器创建虚拟环境
# 创建虚拟环境
pipenv --three
# 或者
pipenv --python 3.9
这种⽅式是指定python解释器,并创建虚拟环境。
它会在当前⽬录⽣成Pipfile,不会⽣成Pipfile.lock
这种⽅式创建虚拟环境后,会⾃动进⼊虚拟环境,但是进⼊后也不会显⽰前缀
⽅式⼆:安装所有依赖时创建虚拟环境
# 创建虚拟环境
pipenv install
这种⽅式是在安装依赖包的同时创建虚拟环境。
因为pipenv install,就是根据Pipfile来安装所有依赖,类似npm install
如果当前⽬录没有Pipfile,它就会⾃动创建Pipfile并创建虚拟环境。
因为这种⽅式它已经在安装所有依赖了,所以不仅会创建Pipfile,也会创建Pipfile.lock⽂件。
同时,它创建虚拟环境后,也会⾃动进⼊环境,但是也不会显⽰前缀。
如下图:
⽅式三:激活时创建虚拟环境
# 激活,如果环境不存在,则创建虚拟环境并激活
pipenv shell
这个命令主要⽤于激活环境,但是如果环境不存在,则会先创建虚拟环境,并同时激活虚拟环境。这种⽅式因为使⽤了pipenv shell激活了,所以创建虚拟环境后,也会⾃动进⼊虚拟环境,并激活。会显⽰虚拟环境前缀。
如下图:
2.3、修改虚拟环境⽬录位置
有三种⽅法:
⽅法⼀:
# ⽅法⼀:
# 设置这个环境变量,pipenv会在当前⽬录下创建.venv的⽬录,以后都会把模块装到这个.venv下。
export PIPENV_VENV_IN_PROJECT=1
⽅法⼆:
# ⾃⼰在项⽬⽬录下⼿动创建.venv的⽬录,然后运⾏ pipenv run 或者 pipenv shell pipenv都会在.venv下创建虚拟环境。
mkdir .venv
pipenv shell
⽅法三:
# 设置WORKON_HOME到其他的地⽅(如果当前⽬录下已经有.venv,此项设置失效)。
export WORKON_HOME=$HOME/.virtualenvs
注意:
⼩技巧: 如果⼦级⽬录的⽗级⽬录已经创建过虚拟环境, 则⼦级⽬录⽆法创建虚拟⽬录(⼦级⽬录⽆法⽣成Pipfile, ⼦级默认会使⽤⽗级的虚拟环境), 如果确实需要在⼦级⽬录创建独⽴的虚拟环境,可以运⾏pipenv --where 获取⽗级虚拟环境的名字, 根据虚拟环境的前半部分名字, 确定⽗级⽬录的位置, 然后删除⽗级⽬录下的Pipfile, Pipfile.lock, 运⾏exit退出⽗级虚拟环境,然后回到⼦⽬录,运⾏pipenv --three创建⼦⽬录的虚拟环境即可
2.4、相关定位操作
定位项⽬⽬录:
[root@ops-130 aaa]# pipenv --where
/data/myproj10
定位虚拟环境⽬录,即virtualenv⽬录
[root@ops-130 aaa]# pipenv --venv
/root/.virtualenvs/myproj10-740tHe3W
定位Python解释器:
[root@ops-130 aaa]# pipenv --py
/root/.virtualenvs/myproj10-740tHe3W/bin/python
如下图:
3、pipenv包管理
安装依赖包:
安装相关依赖包,并加⼊到Pipfile
pipenv install flask
它会在当前环境安装flask依赖包,并记录flask包名以及版本信息,记录到Pipfile⾥。
如果安装的时候,没有指定包名,默认是最新的,会记录为“*”
注意:Pipfile只会记录你install⾥指定的包,但是这个flask包本⾝所依赖的包不会记录,
但是所有的依赖详情都会记录到Pipfile.lock中。
Pipfile.lock类似如下:
查看⽬前安装的库及其依赖关系
pipenv graph
如下图:这是所有的完整依赖关系,这些会记录在Pipfile.lock中。
Pipfile会记录当前虚拟环境安装的所有依赖包及其对应的版本,当我们需要迁移项⽬,部署新项⽬,或者有新⼈接⼿时,就可以直接拿到这个Pipfile和Pipfile.lock⽂件,直接pipenv install即可,它就会按照Pipfile⾥的包,把所有的依赖⽂件都安装上,是不是很⽅便。
安装所有依赖包:
# 根据Pipfile的记录,安装所有依赖包
pipenv install
指定安装包版本:
例如,你可以使⽤如下的命令安装 requests:
pipenv install requests~=1.2  # 相当于 requests~=1.2.0
Pipenv 将安装 1.2 版本和任何 minor 版本的更新,但不会安装 2.0 版本。
上⾯的命令将会⾃动更新 Pipfile ⽂件以体现这个特殊的需求。
通常,Pipenv使⽤与pip相同的参数格式。但是,请注意,根据PEP 440,您不能使⽤包含连字符或加号的版本号。要指定包含或者排除具体的版本,您可以使⽤如下命令:
pipenv install "requests>=1.4"  # 只安装等于或者⼤于 1.4.0 的版本
pipenv install "requests<=2.13"  # 只安装⼩于或者等于 2.13.0 的版本
pipenv install "requests>2.19"  # 安装 2.19.1 版本但是不安装 2.19.0 版本
注意:强烈建议使⽤双引号包裹包名和版本号以避免unix操作系统中的输⼊和输出重定向问题。
请优先使⽤ ~= 标识符⽽不是 == 标识符,因为后者会阻⽌ pipenv 更新包:
pipenv install "requests~=2.2"  # 锁定包的主版本(这相当于使⽤==2.*)
要避免安装某个特定的版本,可以使⽤ != 标识符。
要深⼊解释有效标识符和更复杂的⽤例,请查看 PEP-440 的相关部分。
卸载依赖包:
卸载指定包:
pipenv uninstall flask
卸载包后,相关包和依赖详情会从Pipfile和Pipfile.lock中移除。
卸载当前环境所有包:
# 从虚拟环境中移除所有已安装的包,但 Pipfile.lock ⽂件不受影响
pipenv uninstall --all
卸载开发包:
# 从虚拟环境中卸载所有开发包,并从 Pipfile ⽂件中移除这些包
pipenv uninstall –all-dev
更新依赖包:
查看所有需要更新的包:
pipenv update --outdated
如下图:
更新指定包:
pipenv update <;包名>
更新所有包:
pipenv update
检查安全漏洞:
pipenv check  # 检查安全漏洞
它可能会检查出很多错误,其实如果不影响你使⽤,你可以直接忽略掉。强迫症患者也可以⼀个⼀个问题去解决。⽐如如下问题:
修改pipenv的镜像源
可以修改当前⽬录下Pipfile⽂件,将[source]下的url属性改成国内的源即可:
[[source]]
url = "mirrors.aliyun/pypi/simple"
verify_ssl = true
name = "pypi"
3、环境部署
使⽤pipenv进⾏多环境部署
dev与正式环境区分安装。
当你想要⼀个包只在开发环境使⽤,等⽣产部署的时候,不需要该安装包,你可以这样指定环境安装。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。