Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。
bookwormにバージョンアップしたら、pip installコマンドでインストールできないエラーに出くわしました。
2023年に入り多くのサイトで取り上げています。調べると、pipのバージョン23からPEP668の関係で、準拠していないとpip installが中止される変更のためでした。
このことらしいです。んー、分からん。
PEP 668 – Marking Python base environments as “externally managed” | peps.python.org
あるライブラリを使いたくインストールしようとして同じ目に遭いました。
サクッと解消してしまいましょう。
イイねエラー内容
エラー自体は、pip install 〜で以下のように表示されます。
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.
つまり、仮想環境venvを使ってればインストールさせてくれるの??
詳しくは冒頭のPEP668ページに細かく書いてあります。
解消する方法その1(オプション付きで実行)
インストールする際のコマンドオプションに--break-system-packagesを付ければ回避できるとありました。
インストーラーには、コマンドラインフラグ
--break-system-packagesなど、ユーザーがこれらのルールをオーバーライドする方法が必要です。このオプションはデフォルトで有効にすべきではなく、その使用が危険であるという意味合いを持つべきです。
やってみる。
pip install --break-system-packages パッケージ名
しかし、これは危険であるというのが気になりました。
続けて探していると、次でもいいみたい。
解消する方法その2(pip.confの作成)
毎回オプション指定するのは素人にとって困ります。
ホームディレクトリに以下の内容を記述したpip.confを作成すれば回避することができました。
[global]
break-system-packages = true
ホームディレクトリに隠しフォルダ.pipを作成しconfファイルを配置します。
mkdir ~/.pip
nano ~/.pip/pip.conf
そして再起動すれば、いつものようにインストールできました。
やっていることは、最初のオプションを付けなくても勝手に付けてくれることであり、その1と同じです。
そもそも--break-system-packagesでも対応していないとエラーが出ることはあります。
ラズパイでの動作なら、次の方法は比較的に簡単です。
■Pi 5は8GBモデルがオススメ
解決方法その3(aptパッケージシステムで賄える)
Pythonに関係あるパッケージは、aptパッケージからインストールしてちょ、ってことみたい。
以下の例だとdockerなんですけど、python3-○○○というパッケージ名であればいいわけですね。
sudo pip3 install docker-compose
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.
もし、同じパッケージ名があればそれでいいみたい。どうやらdocker-composeはない。
もしpip3と同名のパッケージ名で、apt python3-○○○で存在していれば、そのインストールで構わない。
この例のdokcer-composeは、別にインストールしなくても、dockerをスクリプトからダウンロード&インストールした時点で、docker composeコマンドが使えました。今はdocker composeでハイフンがないのね。
非エンジニアの私が感じたことは、元々はaptでインストールできないからpipを使っていたのに、今度はaptで使えよということか?
とりあえず、エラーが出たら、python3-xxxを試してみることにしました。
sudo pip3 install xxx
#ここでエラーなら
#python3-xxxを試す
sudo apt install python3-xxx
存在していればそれでOKです。でも、存在していないパッケージの方が多いかもしれません。
正解はPython仮想環境で実行(venv)
venv指定が正解でしょう。
でも、この辺が非エンジニアにはツラいのです。virtual environment(仮想環境)はコマンドインターフェイスだと更に分かりにくいですよね。
自分の理解とは別に、指定する環境パス(Path)が2つになったり、インストール時に指定を忘れてしまったりと、どうしても慣れません。
仮想環境にするには次のコマンドです。
python3 -m venv env
envの部分は好きなように変えられてます。ディレクトリ名です。
python3 -m venv venv
そのままインストールするなら、pipコマンドを続けます。
python3 -m venv env pip install パッケージ名
で、仮想環境をアクティブにする。
source env/bin/activate
プロンプト画面の接頭辞に(env)が付けばアクティブ化されています。
仮想環境から抜けるにはdeactivateします。
deactivate
ユーザーアカウント全体で仮想環境の設定方法
先程の基本形はプロジェクト毎に仮想環境を作るやり方です。ユーザーアカウント毎に設定するやり方なら、pipのパッケージを共有できます。
python -m venv ~/.env
ホームディレクトリに隠しファイル.envとして作成することで、使用しているユーザーアカウント全体で同じパッケージが利用できるため、個人ユーザーであればこれでも良いですね。
venvの実行例
例として、別記事のProjectMSDLを導入した時のインストール方法が分かりやすかったので挙げておきます。これは依存関係のファイルをまとめたrequirements.txtからインストールする時の手順です。
個別のプロジェクト配下でvenv(仮想環境)をインストールする。つまり、実行ファイルがある場所、インストールする場所ってことかな。
cd /opt/ProjectMSDL/
python3 -m venv env
その後にenvを指定しながら、いつものpip installコマンドでrequirements.txt内にある依存関係の解消ファイル群をインストールするというものです。
/opt/ProjectMSDL/env/bin/python3 -m pip install -r requirements.txt
requirements.txtがある場合、この方法は理解しやすかった。
で、この時のPythonの実行コマンドが、やはりを仮想環境先を指定している。/opt/ProjectMSDL/env/bin/python3
/opt/ProjectMSDL/env/bin/python3 /opt/ProjectMSDL/projectMAR.py
はてな?PEP668以前から元々、venv環境で実行するのがお手本と知っていました。個人利用だし、面倒だからそのまま実行していたわけですけど、今後はこのエラーに遭遇してインストールできなくなりましたから、pipを扱うなら慣れないとダメですね。
ちゃんと使うなら次のサイトがまとまっています。
公式からも解説が2024年11月21日に記事化されています。
Using Python with virtual environments | The MagPi #148
Rブラック


