一行命令更新所有包
更新用户路径下的包:
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的最前面,使用起来也没有什么区别。