pip installがexternally-managed-environmentで拒否されたとき、まず導入先がOS管理Pythonか、プロジェクト用venvかを確認します。エラーを消すために保護を解除する前に、目的が「このプロジェクトだけで使うライブラリ」なのか「端末から使うPython製CLI」なのか「OS全体で使うパッケージ」なのか分けてください。通常はproject dependencyをvenvへ、単体CLIをpipxへ、OS管理対象をディストリビューションのpackage managerへ寄せます。
最初に確認するのはPythonとpipが同じ環境を指しているかです。which python、which pipだけでは、複数のPythonやshell aliasがある環境で取り違えることがあります。次を実行し、結果を一組で記録します。
python3 --version
python3 -c "import sys; print(sys.executable); print(sys.prefix); print(sys.base_prefix)"
python3 -m pip --version
python3 -m pip show pip
python -m pipは、そのpythonとして起動したinterpreterに紐づくpipを実行します。pip --versionの表示pathがpython -m pip --versionと異なるなら、違うインストール先を操作している可能性があります。ここでプロジェクトの仮想環境が既に有効か、OSのPythonかを確かめてから分岐します。
目次
エラーが示すこと
PEP 668のexternally managed markerは、Python interpreterがOSなど外部のpackage managerによって管理されていることを示します。仕様では、仮想環境外でそのmarkerが見つかる場合、Python package installerはglobal default環境へのinstallを拒否する動作が定められています。これはpipやPythonの故障ではなく、OSが所有するPython package群をpipが上書き・削除して整合性を壊すリスクを避けるための保護です。表示される案内はディストリビューションごとに異なることがあるので、画面の説明とOSの公式手順を先に読みます。
同じPCに複数のPythonがある場合、エラーを出したinterpreter自体が意図したものかも確認します。python3、python、IDE、notebook、cron、system serviceが別々の実行ファイルを使うことがあります。どの環境へ入れるかを決めるまでは、sudo pipや保護解除flagで再実行しません。
プロジェクト依存ならvenvを使う
Django、FastAPI、開発用CLI以外のlibraryなど、特定repositoryやprojectだけで使う依存は、そのproject内のvenvへ入れるのが基本です。project rootで作成し、以後はvenvのPythonを明示します。
python3 -m venv .venv
source .venv/bin/activate
python -m pip --version
python -m pip install -r requirements.txt
requirements.txtがない場合は、必要なpackage名をprojectの既存手順やpyproject.tomlで確認してから追加します。環境を有効化したprompt表示だけを根拠にせず、python -c "import sys; print(sys.executable)"のpathがproject内の.venvを指すことを確認します。python -m pip --versionも同じ.venvのsite-packagesを示す必要があります。
Windowsでは、例として次のようにvenvのinterpreterを直接指定できます。
py -m venv .venv
.venv\Scripts\python.exe -m pip --version
.venv\Scripts\python.exe -m pip install -r requirements.txt
PowerShellでactivateする場合は環境のExecution Policyなど別条件が関係することがあります。activationが拒否されても、venv内のPythonを直接実行すれば、shell設定を変更せずに対象interpreterを指定できます。directory名.venvは一般的な例ですが、既存projectの命名規則があれば合わせます。
.venvを作成できない、またはensurepipがないと表示される場合は、OS・Pythonの配布元・minor versionを確認します。ディストリビューションによってvenv機能を別packageで提供することがありますが、必要なpackage名を一律に断定せず、エラーに記載された公式案内またはそのOSの公式package検索で確認してください。venv作成に失敗したからといってsystem Pythonへ直接installする必要はありません。
独立したCLIアプリならpipxを選ぶ
ruff、httpieなど、repositoryの依存ではなく端末から使うPython製applicationは、projectごとのvenvに混ぜるよりpipxが適する場合があります。pipxは各applicationを独立したvirtual environmentへ入れ、コマンドを利用者のPATHから実行できるようにする仕組みです。複数CLIの依存が衝突しにくく、project用venvとも分離できます。
pipxが既に使えるか確認します。
pipx --version
pipx list
pipxがなければ、そのOS向けのpipx公式Install手順を確認します。外部管理されたPythonへpip install pipxを強行するのではなく、公式が案内するOS package、専用installer、または承認された方法を選んでください。準備後、単体CLIをpipx install application-nameで導入し、pipx listとcommand --versionで配置と起動を確かめます。実際のpackage名と実行command名は一致しないことがあるため、対象applicationの公式案内を照合します。
一度だけCLIを試すだけで常設したくない場合は、pipxのrun機能が選択肢になります。ただし実行時に取得されるapplicationとversion、network access、追加依存を確認し、組織端末では管理ポリシーに従います。ここでも導入先と実行物を記録しておけば、通常installと一時実行を後から区別できます。
OS管理のpackageならOSの管理手段を使う
OSやディストリビューションがPython moduleをsystem utilityとして提供している場合、管理者がシステム全体へ入れる意図なら、そのOSのpackage managerを利用します。PEP 668の仕様例も、ディストリビューションが提供するpackageとvenv / pipxを用途に応じて案内する形です。ただし、PyPI上の名前とOS package名は違うことがあり、配布versionも一致するとは限りません。pip installのpackage名をそのままapt install等へ置き換えるのではなく、対象OSとversionを指定して公式repositoryのpackage名・保守状況を調べます。
system Pythonのmoduleをアプリケーションが必要とするのか、ただ利用者がCLIを使いたいのかを区別します。projectが特定versionを要求するならvenv、ユーザーが一つのPython CLIを使うならpipx、OSの機能として全利用者に共有するならOS packageが候補です。違う用途の環境へinstallしても、対象のserviceやshellがそのPythonを使わなければ問題は解消しません。
--break-system-packagesを使う前に
pipには、PEP 668の保護を上書きするoptionがあります。しかし、このoptionは名称どおりsystem package管理を壊す可能性のある操作として扱われ、通常の解決手順にはしません。管理者が対象interpreter、sysconfig install location、既存OS packageとの重なり、復旧方法を確認し、明示的に承認した例外でのみ検討します。共有サーバーやsystem serviceのPythonに対して、手順を省く目的で実行しないでください。
--userも常に安全な回避策とは限りません。externally-managed markerの仕様は、単なるuser installを標準的解決として保証しておらず、各installerやディストリビューションの動作条件が異なります。エラーを避けられたかだけでなく、どのschemeにファイルが入り、対象interpreterのsys.pathからどう見えるかを調べて判断します。
よくある失敗と診断
python3 -m venv .venvが失敗する場合は、Pythonの配布元・実行path・OSのvenv提供条件を記録し、公式案内に沿って不足要件を解決します。venv作成後もexternally-managedエラーが続く場合は、activateしたつもりのshellが別interpreterを呼んでいないか、sys.executable、sys.prefix、sys.base_prefix、python -m pip --versionを同じshellで比較します。venv内では通常sys.prefixとsys.base_prefixが異なります。
installは成功したがimportに失敗する場合、導入commandと実行commandが同じPythonを使っているか、distribution package名とimport名が違わないか、IDE/notebookが別kernelを選んでいないかを確認します。CLIが見つからない場合はpipxのenvironmentとPATH設定、login shellの再読み込み、packageが公開するentry pointを調べます。これらはexternally managed marker自体とは別の原因です。
requirements installで別のerrorが出た場合は、externally-managed保護と依存解決問題を分けます。venv内で発生したversion conflictやビルド失敗に対して、system protectionを解除しても原因は直りません。pip --versionとerror全文を保存し、projectのsupported Python version、dependency constraints、binary wheel availabilityなど次の原因を特定します。
作業前後のチェックリスト
表は横にスクロールできます
| 確認 | 記録する値 |
|---|---|
| 目的 | project library / standalone CLI / OS管理package |
| OS・配布元 | 名前、version、Pythonの提供元 |
| interpreter | sys.executable、sys.prefix、sys.base_prefix |
| pip | python -m pip --versionの実行fileとinstall path |
| 導入先 | project .venv / pipx environment / OS package manager |
| 検証 | import、pip show、CLI version、対象project test |
| 回復 | venv再作成、pipx uninstall、OS package rollback等の適用可能な方法 |
変更前の状態を残してから最小範囲で導入し、終わったら対象環境からmoduleまたはCLIが使えることを確認します。projectの依存変更はlockfileやrequirementsの管理方法と合わせ、OS packageの更新は管理者の変更手順に従います。調査目的だけでsystem packageを削除したり、環境全体を作り直したりしません。
判断を一文にする
projectだけで使うlibraryはproject内venv、端末から使うPython CLIはpipx、OS全体で管理するsoftwareはOS package managerを優先します。どれを選んでも、実行するPython・pip・導入先・起動後の検証を同じ環境で確認します。--break-system-packagesは通常手順に含めず、OS・interpreter固有の公式案内と復旧責任が揃っている場合だけ管理者が例外判断します。
次に行うこと
最初にエラー全文、OS / Pythonの提供元、sys.executable、python -m pip --versionを控え、導入目的をproject / CLI / OS管理に分類してください。その結果に合わせてvenv、pipx、OS package managerのいずれかを選び、対象Pythonから導入結果を読み戻します。system Pythonの保護解除を最初の手段にしないでください。
Sources
https://packaging.python.org/en/latest/specifications/externally-managed-environments/(新しいタブで開く)
