Python | Web / API:pip list

Python Python
スポンサーリンク

概要(pip listは「今の環境に入っているライブラリを一望する鏡」)

pip listは、現在のPython(できれば仮想環境)にインストールされているパッケージとバージョンを一覧表示します。環境の健全性確認、アップデート候補の洗い出し、requirements.txtとのズレ検知に役立つ基本コマンドです。重要なのは、どのPythonのpipを見ているか(仮想環境の選択)、出力形式の使い分け(columns・json・freeze)、更新状況の確認(–outdated)、そして「pip list」「pip freeze」「pip show」の役割の違いを理解することです。


最短の使い方(環境を間違えず、まず全体を見渡す)

仮想環境を有効化して一覧表示

プロジェクトの仮想環境を有効化し、pip listを叩きます。どのPythonに紐づくpipかを明示したいときは、python -m pip の形を使うと安全です。

# 仮想環境の作成と有効化(例)
python -m venv venv
source venv/bin/activate  # Windowsは venv\Scripts\Activate.ps1

# 今の環境の一覧
python -m pip list

出力は「Package」「Version」の2列が基本です。この時点で「余計なものが入ってないか」「必要なものが欠けてないか」をざっと確認できます。

どのPythonを見ているかを確認

インタープリタの場所とpipの参照を合わせて確認すると、取り違えを防げます。

python -c "import sys; print(sys.executable)"
python -m pip --version

出力形式の使い分け(人間向けと機械向けを切り替える)

人間向けの表形式(columns、デフォルト)

見やすさ重視の標準表示です。素早い目視確認に向いています。

python -m pip list --format=columns

機械向けのJSON形式(自動化・検証に便利)

JSONにすると、スクリプトから安全に解析できます。更新可否チェックやレポート作成に向いています。

python -m pip list --format=json
import json, subprocess

out = subprocess.check_output(["python", "-m", "pip", "list", "--format=json"], text=True)
pkgs = json.loads(out)  # [{"name": "requests", "version": "2.31.0"}, ...]
print({p["name"]: p["version"] for p in pkgs})
Python

requirements風(freeze形式との違い)

freeze形式で出すと、name==versionの行が並びます。ただし、pip freezeは依存関係まで含めた“完全な固定用”であり、pip listのfreeze形式は「見た目が似ているだけ」で用途が異なります。固定用はpip freeze > requirements.txtを使うのが定石です。

python -m pip list --format=freeze
python -m pip freeze > requirements.txt  # 固定用はこっち

役割の違い(list・freeze・showを正しく使い分け)

pip list(環境全体の俯瞰)

今入っているパッケージの「現状」を一覧します。目視確認、更新候補の把握に最適です。

pip freeze(再現用の完全固定)

依存関係まで含めた“実際に入っている全て”をname==versionで出力します。再現性のためにrequirements.txtへ保存し、別環境に復元します。

python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt

pip show(個別パッケージの詳細)

特定のパッケージのインストール先、依存関係、ホームページ、要約などを確認できます。トラブル時の原因特定に役立ちます。

python -m pip show requests

更新確認・不要依存の見分け(運用で効くオプション)

アップデート候補を洗い出す(–outdated)

現在バージョンと最新バージョンの差を一覧で確認できます。定期メンテ時に使います。

python -m pip list --outdated

上位から直接入れたものだけを見る(–not-required)

トップレベル(自分で入れた)パッケージだけに絞って表示します。余計な依存の混入チェックに便利です。

python -m pip list --not-required

特定のsite-packagesを覗く(–path)

複数環境やツール連携時に、指定ディレクトリのインストール内容を確認できます。

python -m pip list --path ./venv/lib/python3.11/site-packages

実務の型(ズレ検知・レポート・安全なアップデート)

requirements.txtとのズレを検知する

JSON形式で取った現状とrequirements.txtを比較し、差分をレポートすると安全です。

import json, subprocess

curr = json.loads(subprocess.check_output(["python", "-m", "pip", "list", "--format=json"], text=True))
curr_map = {p["name"].lower(): p["version"] for p in curr}

reqs = {}
with open("requirements.txt", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if not line or line.startswith("#") or "==" not in line: 
            continue
        name, ver = line.split("==", 1)
        reqs[name.lower()] = ver

missing = sorted(set(reqs) - set(curr_map))
updiff = {n: (curr_map.get(n), reqs[n]) for n in reqs if curr_map.get(n) and curr_map[n] != reqs[n]}
print("Missing:", missing)
print("Version diff:", updiff)
Python

Missingに何が足りないか、Version diffでどれがズレているかを把握できます。CIで定期的にチェックすると、環境の腐敗を防げます。

安全なアップデートの流れ

新しい仮想環境を作り、–outdatedで候補を見て、限定的にアップグレードし、テストを通してからpip freezeで固定し直します。いきなり本番環境でアップグレードせず、必ず検証環境で確認します。

python -m venv venv-up && source venv-up/bin/activate
python -m pip install -r requirements.txt --upgrade
pytest -q
python -m pip freeze > requirements.txt

よくあるつまずきへの対処(環境取り違え・出力の誤用)

グローバル環境を見てしまう

仮想環境を有効化していないと、グローバルの一覧が表示されます。必ず有効化してからpython -m pip listを使い、sys.executableでインタープリタのパスも確認すると安心です。

freeze形式をそのまま比較に使う誤解

pip listの–format=freezeは“似た見た目”ですが、再現性検証や固定には向きません。固定用途はpip freezeを使い、比較やレポートはpip list –format=jsonで機械処理するのが堅実です。

アウトデート一覧の一括更新で壊れる

–outdatedで出たものを一括で更新すると依存競合が起こることがあります。重要パッケージから段階的に更新し、テストを都度通すのが安全です。


まとめ(pip listは「現状把握」と「健全性維持」の起点)

pip listは、今の環境に何が入っているかを素早く把握し、更新候補や不要依存を見つけるための入口です。仮想環境で実行し、出力形式を用途で使い分ける(columnsで目視、jsonで自動化)。freezeは固定用、showは詳細確認用と役割を分け、–outdatedや–not-requiredで運用の質を上げる。requirements.txtとのズレ検知と段階的なアップデートを型にすれば、初心者でも短い手順で「壊れない・再現できる・健全な」Python環境を維持できます。

タイトルとURLをコピーしました