pip install and pip freeze are simplified with this script, which automatically backs up package lists. Detailed setup and usage instructions help you avoid accidental installs.
相模原市で IoT 設計を受託しているファームロジックスです。
今回は Python pip によるパッケージ管理の話です。ちょっと便利なスクリプトを書いてみました。皆様のお役に立てれば幸いです。
pip install で困ったことはありませんか?
Python プロジェクトの開発では、pip
を使ったパッケージ管理が不可欠です。しかし、pip install
実行時に、環境の状態を記録しておくことは意外と手間です。「pip install
の前には、pip freeze
を実行しておきましょう!」という提案は良くみますが、大抵は何気なく pip install
で大量の依存パッケージをインストールしてしまい、「このパッケージは要らないかなあ」と思ってから、pip uninstall
で途方にくれる、というのが日常ではないでしょうか。
今回、私はその手間を解消するために、pip install
の前後で pip freeze
を自動的にバックアップ(記録)するシンプルなラッパースクリプトを作成してみました。新しいコマンドの利用を強制する訳ではなく、普段使っている pip install
コマンドを自動的にラップする、というのがポイントです。本記事では、その概要と導入手順について紹介します。
スクリプトの実装概要
今回のスクリプトでは、pip install
コマンドを Bash あるいは Zsh の関数定義でラップし、インストール前後のパッケージリストを pip freeze
出力の形で自動的に保存します。さらに、pyenv
を利用している場合には、インストール時の Python バージョンと virtualenv も記録することが可能です。このスクリプトの詳細なコードは、GitHub リポジトリにて公開させて頂きましたので、ぜひご参照ください。
セットアップ方法
セットアップは非常にシンプルです。まず、GitHub リポジトリからスクリプトをダウンロードし、ホームディレクトリに保存します。次に、~/.bash_profile
または ~/.zshrc
にスクリプトを読み込む設定を追加します。以下に例を示します。
# Import pip freeze backup script if [ -f "$HOME/.pip_freeze_backup.bash" ]; then source "$HOME/.pip_freeze_backup.bash" fi
設定後、source ~/.bash_profile
もしくは source ~/.zshrc
を実行して反映させれば、準備は完了です。
実行例と使い方
セットアップ後は、通常通り pip install
コマンドを実行するだけで自動的にバックアップが作成されます。バックアップは、タイムスタンプ付きのファイルに保存され、インストール前後の状態を簡単に確認できます。以下は、実際の実行例です。
$ pip install requests pip freeze (before install) backed up to /home/user/pip_freeze_backup/20240929_123456_before.txt pip freeze (after install) backed up to /home/user/pip_freeze_backup/20240929_123456_later.txt
バックアップファイルには、実行した pip install
コマンドの引数、インストール前のパッケージリスト、pyenv
バージョン情報(利用している場合)、そしてインストール後のパッケージリストがそれぞれ記録されます。
注意点
このスクリプトは pip install
コマンドのみに対応しており、他の pip
コマンド(例: pip uninstall
, pip list
など)はそのまま実行されます。また、pyenv
を利用している場合には、インストール前の Python バージョンがバックアップに記録されます。スクリプトのカスタマイズも容易なので、必要に応じてディレクトリ名やファイル名のフォーマットを変更することが可能です。
終わりに
実は当初、このようなツールの要求は多いだろうから、きっと既存の実装があるに違いないと思って探してみました。次のような議論はありましたが、あまり盛り上がっておらず、pip コマンド自体にそのような機能が追加される見込みはなさそうです。
また、既存の便利ツールを見つけることもできませんでした。まあ、このようなラッパーを書くには大した技術は要らないので、みんなこっそり書いて利用しているのだろう、と思います。