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など、ユーザーがこれらのルールをオーバーライドする方法が必要です。このオプションはデフォルトで有効にすべきではなく、その使用が危険であるという意味合いを持つべきです。

https://peps.python.org/pep-0668/

やってみる。

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ブラック Rブラック
仮想環境venvならいいのか、素人には面倒になってきたぞ、pip。