PythonPython [パイソン]汎用プログラミング言語での開発中、「別のPCでも同じプログラムを動かしたい」「本番環境にデプロイしたい」という場面に必ず遭遇します。
その際、現在の環境にインストールされているライブラリ(パッケージ)をそのまま別の環境へ引き継ぐために活躍するのが pip freeze コマンドです。
本記事では、pip freezeの基本的な使い方から、requirements.txtを用いた環境の再現手順、そして混同されがちなpip listとの違いまでを分かりやすく解説します。
pip freezeとは?
pip freezeは、現在のPython環境にインストールされているパッケージと、そのバージョンの一覧を出力するコマンドです。
出力されるフォーマットがそのまま「インストール用の設定ファイル」として使える形式(パッケージ名==バージョン)になっているのが最大の特徴です。
単にターミナル(コマンドプロンプト)で実行すると、以下のように画面に一覧が表示されます。 なお、出力されるパッケージ名は アルファベット順(大文字小文字を区別しない) で自動的にソートされます。
pip freezecertifi==2023.7.22charset-normalizer==3.3.2idna==3.6requests==2.31.0urllib3==2.1.0requirements.txtを作成して環境を移行する手順
pip freezeの最も代表的な使い道は、requirements.txt の作成です。
このファイルを使って、別のPCやサーバーに同じパッケージ環境を構築する手順を解説します。
ステップ1:現在の環境のパッケージリストを書き出す
ターミナルで以下のコマンドを実行し、pip freezeの出力結果を requirements.txt というファイルに保存(リダイレクト)します。
pip freeze > requirements.txtこのコマンドを実行すると、現在のディレクトリに requirements.txt が作成されます。中身を見ると、先ほど画面に表示されたパッケージ一覧がそのまま保存されていることが分かります。
ステップ2:別の環境で一括インストールする
作成した requirements.txt を、環境を移行したい別のPCやサーバーにコピーします。
移行先の環境で以下のコマンドを実行すると、ファイルに記載されているすべてのパッケージが指定されたバージョンで一括インストールされます。
pip install -r requirements.txtこの2つのステップで、インストールされているPythonパッケージの構成を別の環境に再現できます。
注意:ローカルパスやGitからのインストールが含まれる場合
開発中に pip install -e . のような「エディタブルインストール(Editable install)」を行っていたり、GitGit [ギット]ソースコードの変更履歴を管理する分散型バージョン管理システムリポジトリから直接インストールしたパッケージが存在する場合、pip freeze の出力は以下のようになります。
-e file:///path/to/pkgパッケージ名 @ git+https://...
この状態の requirements.txt を別のPC(パスが異なる環境)へ持っていくと、指定されたローカルパスが存在せずインストールに失敗することがあります。そのため、別環境へ移行する前に該当行を削除するか、PyPIからインストール可能な通常のバージョン指定に書き換える必要がある点に注意してください。
[!TIP] 「@ file:///」などのローカルパス混入を防ぐスマートな解決策 Anaconda環境やエディタブルインストールの影響でパスが混入してしまう場合、代わりに
pip list --format=freeze > requirements.txtコマンドを使用するのがおすすめです。 これにより、ローカルパスに変換されず、綺麗に「パッケージ名==バージョン」の形式で均質な出力が得られます。
pip freeze と pip list の違い
インストールされているパッケージを確認するコマンドとして、pip list もよく使われます。
両者は似ていますが、「機械向け/人間向け」という単純な違いではなく、用途と出力形式によって使い分けられます。
| コマンド | 主な用途 | 特徴 |
|---|---|---|
pip freeze | requirements.txtの作成・環境再現 | requirements形式で出力される |
pip list | インストール済みパッケージの確認 | 表形式で人間が見やすい |
pip list の特徴
pip list はデフォルトでは、人間が目視で確認しやすい表形式で出力されます。
Package Version------------------ ---------certifi 2023.7.22charset-normalizer 3.3.2idna 3.6requests 2.31.0urllib3 2.1.0また、pip list --outdated を使うと、アップデート可能なパッケージのみをリストアップすることもできます。
「今何が入っているか確認したい」時は pip list、「環境を別へ移行したい」時は pip freeze と覚えておきましょう。
注意点:不要なパッケージまで出力されてしまう場合
pip freeze は、現在の環境に入っているパッケージを出力します。
[!WARNING] デフォルトで除外されるパッケージの仕様変更(Python 3.12以降) Python 3.11以前では
pipやsetuptools、wheelなどがデフォルトで除外されていましたが、Python 3.12以降ではpipのみが除外される仕様に変わっています。 そのため、Python 3.12以降の環境では、デフォルト状態であってもsetuptoolsなどが出力に含まれる点に注意してください。
ここでの注意点として、pip freeze は 「直接インストールしたパッケージ」と「それに伴って自動インストールされた依存パッケージ」を区別しません。
そのため、直接プロジェクトで使っていないパッケージ(他のプロジェクト用にインストールしたものや、間接的な依存関係)まで全て requirements.txt にフラットに列挙されてしまいます。
[!NOTE] 「Manifest(宣言)」と「Lockfile(固定)」という考え方
なぜ不要に見えるパッケージまで出力されるのでしょうか?それは用途の違いによるものです。
- Manifest(宣言):人間が「このプロジェクトではこれを使いたい」と意思表示するための依存関係定義。
- Lockfile(固定):機械が本番環境などを「完全に同じ状態で再現」するための全バージョン固定定義。
pip freezeは、環境を完全に複製するための Lockfile(requirements.lockなど)を作る用途に適しています。一方、人間が管理する Manifest(requirements.txt)を作りたい場合は、次に紹介するpipreqsを使うか、手動で本当に使っている依存だけを記述するのが一般的です。
こうした意図しないパッケージの混入を防ぐためには、仮想環境(venvなど) をプロジェクトごとに作成し、クリーンな環境で開発を行うのがベストプラクティスです。
応用テクニック:ソースコードから必要なパッケージだけを抽出する
「すでに色々なパッケージが入ってしまった環境から、本当にこのコードで使っている(importしている)パッケージだけを抽出したい」という場合は、外部ツールの pipreqs が便利です。
pipreqs の使い方
まず pipreqs をインストールします。
pip install pipreqsその後、プロジェクトのディレクトリを指定して実行します。(カレントディレクトリの場合は .)
pipreqs .これで、ソースコード内の import 文を解析し、必要なパッケージを記載した requirements.txt を自動生成してくれます。
pipreqs の限界(注意点)
pipreqs はソースコードの import 文を静的に解析する仕組みです。そのため、以下のようなケースでは正しくパッケージを検出できない(あるいは誤検出する)ことがある点に注意が必要です。
importlib.import_module()などを使った動的なインポート- パッケージ名とインポート名が異なるケース(例:インストール時の名前は
Pillowやopencv-pythonだが、コード上はimport PILやimport cv2と書く場合など)
完璧ではないため、生成された requirements.txt の中身を一度目視で確認することをおすすめします。
まとめ
本記事では、Pythonの環境構築に欠かせない pip freeze について解説しました。
pip freeze > requirements.txtで現在の環境をファイルに書き出すpip install -r requirements.txtで別の環境に一括インストールする- 閲覧目的の
pip listと、環境再現目的のpip freezeは使い分ける - 本当に必要なものだけを抽出したい場合は
pipreqsも検討する
Python開発において環境の引き継ぎや共有は日常茶飯事です。ぜひ pip freeze をマスターして、スムーズな開発を進めましょう!
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
「絶対に挫折させない」という著者の強い意志を感じる、プログラミングの「最初の1冊」としておすすめできる良書です。