[小ネタ] Nushellでpipパッケージの一括更新を行う方法

[小ネタ] Nushellでpipパッケージの一括更新を行う方法

Clock Icon2025.04.29

しばたです。

私は以前の記事で紹介したEmbeddable Python環境を定期的に更新して現在まで利用し続けています。

https://dev.classmethod.jp/articles/try-cfn-lint-casually-on-windows/

先日常用するシェルをNushellに変えてからはじめて環境を更新したので簡単に手順をまとめてみました。

pipパッケージの一括更新方法

pipで管理しているパッケージを一括更新する方法は昔から変わらず

  1. pip listコマンドの結果から逐次パッケージを更新する
  2. pip freezeコマンドの結果から逐次パッケージを更新する
  3. 外部パッケージ(pip-review)を使う

が主流の様です。

pip listコマンドには更新があるパッケージだけを対象とする--outdated (-o)オプションがあり、加えて--formatオプションで出力形式をJSONにすることもできます。
Nushellで扱うにはうってつけなので今回はpip listコマンドを使った方法を採用します。

Nushellでpipパッケージの一括更新を行う

pip listコマンドを次の様に実行してやればJSONで出力し、さらにNushellのTable型オブジェクトに変換できます。

Nushell
# --format jsonでJSON出力できるので、from jsonコマンドで変換してやる
pip list -o --format json | from json

実行例はこんな感じです。

how-to-pip-upgrade-all-on-nuhshell-01
C:\aws\cfn-python-lint\フォルダ配下にEmbeddable Python環境がある場合

あとはこの結果から各モジュールをpip install -Uコマンドで更新してやればOKです。

Nushell
# eachコマンドを使って一括アップデート
pip list -o --format json | from json | each {pip install -U $in.name}

eachコマンドの実行結果はListになるのでコンソール上の表示には連番が付きます。

how-to-pip-upgrade-all-on-nuhshell-02

how-to-pip-upgrade-all-on-nuhshell-03

コマンド実行後に再チェックすると全てのモジュールが更新済みであることがわかります。

how-to-pip-upgrade-all-on-nuhshell-04
更新対象がなくなっている(空リストになっている)

無事一括更新ができました。

余談1 : JSON出力できるならPowerShellでも良いしjqを使っても構わない

身も蓋もない話ですが、JSONの取り扱いが簡単にできる環境であればNushellでなくとも同様の事は実現できます。

例えばPowerShellにはConvertFrom-Jsonコマンドがありますし、Windows環境でもjqは使えます。
今回のコマンドはPowerShellだと次の内容で代替できます。

PowerShellで代替する場合
# ConvertFrom-JsonコマンドでJSONを変換
pip list -o --format json | ConvertFrom-Json
# 更新にはForEach-Objectを使う
pip list -o --format json | ConvertFrom-Json | ForEach-Object {pip install -U $_.name}

余談2 : Windows環境の場合UTF-8 modeを有効にしておいた方が良い

比較的新しいバージョン(v22)からpip inspectコマンドが追加されPython環境に関する情報を高速にJSONで取得できます。

こちらは今回のpip listコマンドよりも多くの情報を取得できるのですが、私の環境(日本語版Windows 11)で実行するとエラーになることがありました。

Nushell
# pip inspectコマンドでエンコーディング周りのエラーが出ることがある
pip inspect | from json

how-to-pip-upgrade-all-on-nuhshell-05

UnicodeEncodeError: 'cp932' codec can't encode character '\xf6' in position 9: illegal multibyte sequence
Error: nu::parser::non_utf8_custom

エラーメッセージから明らかに日本語環境のエンコーディング(CP932)が悪さをしていることが見て取れます。
この様な場合PYTHONUTF8環境変数を設定しUTF-8 modeを有効することで問題を回避できます。

Nushell
# UTF-8 modeを有効にしてエンコーディングの問題を回避
$env.PYTHONUTF8 = 1
pip inspect | from json

UTF-8 modeを有効にした結果、エラーなく期待通りの値を取得できています。

how-to-pip-upgrade-all-on-nuhshell-06

UTF-8 modeはPythonが内部的に使用するエンコーディングをUTF-8にする機能で、以下の記事が詳しいのでご一読ください。

https://methane.hatenablog.jp/entry/2022/04/26/Python_3.15からデフォルトのエンコーディングがUTF-8になり

最後に

簡単ですが以上となります。

ちょっとした小ネタですが誰かの役に立てば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.