初めての記事がこんなので良いのだろうかと思うのですが、誤記等あればご指摘ください。
pipをアップデートする
pip-reviewなんかを使うことが一般的かと思います。ただ、pip-review
とやっても、pip list -o
とやっても、アップデートすべきリストというのは出てきますが、リストから手動でアップデートしなければなりません。
なので、python3+pipを入れている環境限定になりますが、OSコマンドを発行した出力を引っ張ってきて、すべてアップデートするスクリプトを作ってみました。個別に入れる・入れないを判断する場合には使えません。すべてアップデートされます(本当は1個ずつ「アップデートしますか?」と聞くのが良いのでしょうが)。
python3にパスが通っていることは確認してください。which python3
で確認することができます。
また、pipが必要です。バージョンによって同梱されていることもあるようです。
update.py
import subprocess #OSコマンドが実行できるようにします。
print("Update start")
# npmもアップデートしたいときは、以下の2行をコメントインしてください。
# print("Updating: npm")
# subprocess.run(["npm", "update"])
# brewもアップデートしたいときは、以下の6行をコメントインしてください。
#print("Updating: brew")
#subprocess.run(["brew", "update"])
#print("Updating: brew")
#subprocess.run(["brew", "upgrade", "--clean"])
#print("Cleanup: brew")
#subprocess.run(["brew", "cleanup"])
print("Updating: pip")
# UPDATE_LISTに、コマンド実行の結果をそのまま格納します。
# コマンドは空白を使えないので、空白ごとにカンマで区切ります。
# 以下では、[pip lise -o]を実行し、その結果を格納しています。
UPDATE_LIST = (subprocess.run(["pip", "list", "-o"],stdout=subprocess.PIPE))
# 出力の結果を行単位に分割します。
Packages = str(UPDATE_LIST.stdout).split('\\n')
# 出力の先頭2行はタイトルと区切り線なので、捨ててしまいます。
# パッケージ名とバージョン番号のセットで出てくるので、空白で区切った先頭をパッケージ名として取得します。
# そのパッケージ名を [pip install -U] します。
# uasiさんからコメントをいただきましたので修正しました。ありがとうございます。
for package in Packages[2:]:
name = package.split()[0]
print("Updating: " + name)
subprocess.run(["pip", "install", "-U", name])
print("Update finished.")
もうちょっとこなれた書き方にすべきとは思いましたが、動作確認のできる環境がないので、みなさんからのコメントを伺いながらブラッシュアップしていきます。
動かすとき
python3 ./update.py
動かした結果
$ python3 ./update.py
Update start
Updating: npm
Updating: brew
Updated 2 taps (homebrew/core and homebrew/cask).
==> Updated Formulae
bup imagemagick libsoup
gjs imagemagick@6 varnish
==> Deleted Formulae
taylor tcptrack
Updating: brew
Cleanup: brew
Updating: pip
Update finished.
$