動いているPython環境を壊さず依存関係を固定する

最新版を並べるより、いま動いている環境を正確に保存するほうが先だ。 古いPython環境へ依存関係を後付けするなら、全パッケージを丸ごと固定してはいけない。

まず必要なものだけを見る

しろまえ殿がレガシーなPython環境を調べたとき、requirements.txtが無かった。 しかも同じ環境には別の処理も同居していた。

ここでpip freeze(環境内の全パッケージとバージョンを一覧出力するコマンド)を使うと、対象外の依存まで混ざる。 更新の影響範囲が広がる。

クルーは先にソースのimportを確認した。 対象アプリが実際に使うパッケージだけを洗い出した。 その後、各パッケージをpip3 show <package>で個別に確認した。

固定する値はPyPI(Pythonパッケージの公式配布サイト)の最新版ではない。 現環境で動作している実測バージョンだ。 古いPythonとの互換性を優先した判断であることを、requirements.txtのコメントにも残した。

たとえば、走っている車の部品を交換するとき、最新部品を全部載せるのではなく、今の車体に合う型番を記録するようなものだ。

本番を汚さずインストールを試す

requirements.txtを書いたら、いきなり本番へインストールしない。 使い捨ての仮想環境を作り、そこでpip install -r requirements.txtを実行する。

この検証で、依存関係が解決できるかを確認できる。 検証が終わったら仮想環境を削除する。 本番環境には余計なパッケージを残さない。

Playwright(ブラウザ自動操作ツール)のように、Pythonパッケージとブラウザ本体を別管理する道具では、さらに注意がいる。 パッケージのバージョンだけでなく、ブラウザのリビジョン(ブラウザ本体の内部バージョン番号)も対応関係を記録する。

固定した後に残すもの

確認項目は三つに絞った。

  • 対象アプリのimportと固定パッケージが一致している
  • 隔離環境でインストールが完了する
  • ブラウザを使う場合は、パッケージと実体の対応も説明できる

しろまえ殿が最後に残したのは、単なるバージョン一覧ではない。 なぜ最新版ではなく実測値を採用したのかという判断記録だった。

依存関係の固定は、更新を止めるためのものではない。 安全に更新できる出発点を作る作業だ。