一行命令更新所有包
更新用戶路徑下的包:
pip list --user -o --format=freeze | cut -d '=' -f 1 | xargs -n 1 -I % zsh -c "pip install -U --user %"
更新系統(tǒng)路徑下的包:
sudo pip list -o --format=freeze | cut -d '=' -f 1 | xargs -n 1 -I % zsh -c "pip install -U %"
解釋
-
pip list: 作用很明顯了。。。-
--user: 只看用戶路徑下的包。
要更新系統(tǒng)路徑的包需要把這個(gè)去掉,并在命令前面加上sudo -
-o: 只看過(guò)期/可以更新的包 -
--format=freeze: 讓輸出列表變成簡(jiǎn)單的 包名==版本號(hào) 形式。方便我們提取包名。
-
-
cut: 接收一個(gè)字符串,并按條件裁減成子字符串-
-d '=': 指定=字符為分隔符 -
-f 1: 分隔后提取第一個(gè)子字符串,這樣就得到了包名。
-
-
xargs: 接收字符串并按行對(duì)每個(gè)子字符串執(zhí)行自定義指令-
-n 1: 每次提取一個(gè)字符串,也就是一個(gè)包名,實(shí)際上對(duì)于pip install并不需要。 -
-I %: 指定替換字符為%。在自定義指令中他會(huì)將這個(gè)%替換成提取出的字符串。 -
zsh: 自定義指令,這里我們調(diào)用子進(jìn)程shell來(lái)執(zhí)行命令。 -
-c "pip install -U --user %": 傳入需要執(zhí)行的指令。
-
更新系統(tǒng)包,只需要最前面加上sudo,并去掉--user即可。
但是不建議更新系統(tǒng)包,或者把自己用的包安裝在系統(tǒng)路徑下。因?yàn)橐恍┫到y(tǒng)的系統(tǒng)部件是對(duì)系統(tǒng)路徑的包有依賴的。如果某個(gè)包出現(xiàn)重大變化,可能會(huì)導(dǎo)致操作系統(tǒng)(mac/linux)出問(wèn)題。
自己用,最好是--user或者把包交給venv管理。這樣不會(huì)影響系統(tǒng)包的版本。在*nix之下,把site-package/bin加入到PATH的最前面,使用起來(lái)也沒(méi)有什么區(qū)別。