一行命令更新所有包
更新用户路径下的包:
pip list --user -o --format=freeze | cut -d '=' -f 1 | xargs -n 1 -I % zsh -c "pip install -U --user %"
更新系统路径下的包:
sudo pip list -o --format=freeze | cut -d '=' -f 1 | xargs -n 1 -I % zsh -c "pip install -U %"
解释
-
pip list
: 作用很明显了。。。-
--user
: 只看用户路径下的包。
要更新系统路径的包需要把这个去掉,并在命令前面加上sudo
-
-o
: 只看过期/可以更新的包 -
--format=freeze
: 让输出列表变成简单的 包名==版本号 形式。方便我们提取包名。
-
-
cut
: 接收一个字符串,并按条件裁减成子字符串-
-d '='
: 指定=
字符为分隔符 -
-f 1
: 分隔后提取第一个子字符串,这样就得到了包名。
-
-
xargs
: 接收字符串并按行对每个子字符串执行自定义指令-
-n 1
: 每次提取一个字符串,也就是一个包名,实际上对于pip install
并不需要。 -
-I %
: 指定替换字符为%
。在自定义指令中他会将这个%
替换成提取出的字符串。 -
zsh
: 自定义指令,这里我们调用子进程shell来执行命令。 -
-c "pip install -U --user %"
: 传入需要执行的指令。
-
更新系统包,只需要最前面加上sudo
,并去掉--user
即可。
但是不建议更新系统包,或者把自己用的包安装在系统路径下。因为一些系统的系统部件是对系统路径的包有依赖的。如果某个包出现重大变化,可能会导致操作系统(mac/linux)出问题。
自己用,最好是--user
或者把包交给venv
管理。这样不会影响系统包的版本。在*nix之下,把site-package/bin
加入到PATH
的最前面,使用起来也没有什么区别。
网友评论