pip install
コマンドでライブラリをインストールしようとした時に、次のようなエラーが発生することがあります。
$ pip install -U pygame --user
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.
For more information visit http://rptl.io/venv
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
この externally-managed-environment
エラーは、pip
によるPython固有のパッケージ管理と、OS管理によるパッケージマネージャの競合を解消するために導入されたPEP668に基づくエラーです。
とりあえず、まずは表示されたエラーメッセージを見てみましょう。
エラー: 外部管理環境
× この環境は外部で管理されています
╰─> Pythonパッケージをシステム全体にインストールするには、apt install
python3-xyz(xyzはインストールしようとしているパッケージです。)
をインストールします。
Debianパッケージ以外のPythonパッケージをインストールしたい場合、
python3 -m venv path/to/venv を使って仮想環境を作ります。
そしてpath/to/venv/bin/pythonとpath/to/venv/bin/pipを使います。そして
python3-fullがインストールされていることを確認してください。
詳しくはhttp://rptl.io/venv。
note: もしこれが間違いだと思うのであれば、PythonのインストールやOSの配布元に連絡してください。Python のインストールや OS が壊れる危険を冒してでも、 --break-system-packages を渡すことでこれを上書きすることができます。
hint: 詳細な仕様は PEP 668 を参照してください。
見てみると、「パッケージをインストールするならapt install
使えよ、じゃなければ仮想環境を作れよ。詳しくはPEP668で検索!」という感じだそうです。
ちょっと待って、PEP668って何ぞ?
PEP668とは、Pythonのパッケージ管理ツールと、OSのパッケージマネージャの競合を解決するためのPEPです。
Pythonのパッケージをインストールするには、大きく分けて2つの方法があります。
pip
を利用してインストールする方法apt
のようなOSが提供するパッケージ管理の機能を使ってインストールする方法ところが、apt install python-pygame
とpip install pygame
では、「Pygameを導入するぜ」という行為そのものが同じであるものの、OS固有のパッケージ管理機能からするとpip
でインストールされたパッケージは管理外です。そのため、不用意に使うとOSのPython環境に対して悪影響を与える可能性があります。
apt
で導入したパッケージが使いたかったのに、pip
で導入してしまったパッケージが優先されてしまう。PEP668は、この問題を解決するための新しいルールです。
これで、Pythonのアプリケーションと基本ソフトのアプリケーションが競合しなくなり、安全にPythonを利用できるようになります。
このエラーを解決するには、いくつかの対処法があります。
何らかの理由で「いろいろ余裕がない」とか、「どんなに壊れても構わない」という場合は、この方法がたぶん一番早いと思います。それは、--break-system-packages
オプションを付与することです。これで、従来どおりインストールできます。
pip install --break-system-packages pygame
ちなみに、アンインストール時も同様に--break-system-packages
オプションを付与することで、エラーに悩まされず従来どおりアンインストールできます。もちろん、自己責任ですが。
PEP668が制定された目的に沿うなら、こっちの方法が正攻法です。そもそも、現状では仮想環境を作成してその中でパッケージをインストールするのが一般的だと思います。
venv
を使うpython -m venv venv # 仮想環境の作成
source venv/bin/activate # 仮想環境のアクティベート
pip install pygame # パッケージのインストール
このように、venv
を使って仮想環境を設定することで、pip install
エラーを回避できます。
PEP668が制定された背景や理由を鑑みると、可能な限り仮想環境を構築したうえでPythonを使用することをオススメします。
venv
以外の仮想環境を使う何らかの理由でvenv
を利用せず、他の方法でPythonの仮想環境を構築する場合でもこのエラーが発動する可能性があります。この場合も、--break-system-packages
オプションを付与してインストールしてしまうのが最短です。