できない.dev

externally-managed-environment

別名: PEP 668 / 外部管理環境 / EXTERNALLY-MANAGED

OS のパッケージマネージャが所有する Python 環境への pip インストールを拒否する仕組み。
PEP 668 で標準化され、システムの Python が壊れるのを未然に防ぐ。

公開:

定義

externally-managed-environment は、OS 側のパッケージマネージャが所有している Python 環境に対して pip install を実行したとき、pip がインストールを拒否して出すエラーである。
PEP 668 で標準化された仕組みで、その環境の標準ライブラリのディレクトリに EXTERNALLY-MANAGED という名前のマーカーファイルが置かれていると発動する。

詳細

このマーカーは Debian 12 以降・Ubuntu 23.04 以降・Fedora・Homebrew の Python に同梱されている。
システムの Python は OS 自身の管理ツールが依存しているため、pip がその配下のパッケージを上書きしたり削除したりすると、パッケージ管理コマンド自体が動かなくなる。
PEP 668 は、壊れてから気づく事態を避けるために配布元がマーカーを置き、pip がそれを尊重して最初に止める、という取り決めである。

正しい回避は環境を分けることで、python3 -m venv .venv を作ってその中の pip を使えばマーカーの外に出る。
コマンドラインツールを入れたいだけなら pipx を使う手もある。

よくある誤解

  • --break-system-packages を付ければ解決する: 拒否を黙らせるだけで、システムの Python を壊す危険は残ったままである。
    恒久策は pip install が「externally-managed-environment」で失敗する の通り仮想環境に寄せることである。
  • pip の不具合である: pip 側のバグではない。
    ディストリビューションが意図して置いたマーカーに pip が従っているだけである。

関連

環境を分ける仕組みそのものは venv、パッケージの取得元は PyPI が担う。
CI のようにコンテナ全体が使い捨ての環境では、マーカーを外す運用が選ばれることもある。

この記事は役立ちましたか?