2023/06/19

Ubuntu 23.04におけるexternally-managed-environmentエラーへの対処

  1. 一般ユーザでpipを用いるよりもディストリ提供のPythonパッケージの使用が推奨される
  2. pipxを用いて一般ユーザ向けにPyPIのパッケージをインストールする
    1. 注意点
      1. 複数のパッケージ名の指定
      2. 過去にpipで管理していたパッケージとの競合
      3. シェルの設定で環境変数PATHに特定のディレクトリを含めておく必要がある

一般ユーザでpipを用いるよりもディストリ提供のPythonパッケージの使用が推奨される

Ubuntu 23.04に上げた後、pipを用いてPyPI(Pythonのパッケージを登録して配布できる場所)上のPythonパッケージをインストールしようとすると

$ python3 -m 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.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.11/README.venv for more information.

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.

と表示されて失敗する。

ディストリ提供のPythonにはpython3-[名前]形式のパッケージ名のディストリ提供のパッケージ群(バージョンが最新ではないことも多い)があるため、両方が入っている場合に不具合の原因となる可能性があるための措置と考えられる。

上のメッセージにある通り--break-system-packagesオプションを付けて強制的に実行することも可能で、従来と同様のインストールの仕方で使うことはできるのだが、ディストリのパッケージが提供されていないパッケージの場合を除いて推奨はできない。

pipxを用いて一般ユーザ向けにPyPIのパッケージをインストールする

ディストリのpipxパッケージがインストールされていれば、pipに近い感覚でPyPIのパッケージをトラブルなく管理することができる。

(特定のPyPIパッケージをpipxでインストールする)
$ pipx install [パッケージ名]

(pipxでインストール済みの全パッケージを最新に更新する)
$ pipx upgrade-all

(pipxでインストール済みの特定のパッケージをアンインストールする)
$ pipx uninstall [パッケージ名]

注意点

複数のパッケージ名の指定

Ubuntu 23.04でパッケージとしてインストールできるpipxはバージョン1.1.0だが、このバージョンの時点ではパッケージ名を複数指定することはできないので、名前を指定してまとめてインストールしたいものがある場合はシェルのfor文などを使う必要がある。

過去にpipで管理していたパッケージとの競合

これまで一般ユーザ権限でpipを用いてPyPI上のパッケージをインストールしてきている環境では既定の場所として[ホームディレクトリ]/.local/以下にそのパッケージごとのディレクトリにファイル群が配置されており、pipxでも少しの違いがあるものの[ホームディレクトリ]/.local/以下を用いることに変わりはないため、pipxでインストールしたコマンドがうまく動作しないことがある。

場合によっては、pipxへの移行にともない

  • [ホームディレクトリ]/.local/bin/以下にあるコマンドのファイル(実行用のスクリプトファイル)
  • [ホームディレクトリ]/.local/lib/python[バージョン]/site-packages/[名前]/以下のパッケージごとのディレクトリ

の削除が必要なことがあるかもしれない。

pipxでは$PIPX_HOME/venvs/以下にインストール対象のパッケージごとのPython用仮想環境(virtualenv)のディレクトリが存在し、その中のbin内の実行用スクリプトファイルに対するシンボリックリンクが$PIPX_BIN_DIRに作成される。

環境変数PIPX_HOMEの未定義時は[ホームディレクトリ]/.local/pipx/の下にvenvsディレクトリが存在し、PIPX_BIN_DIRの未定義時は[ホームディレクトリ]/.local/bin/が実行用のシンボリックリンクの配置ディレクトリになる(以下$PIPX_BIN_DIR)。これらのディレクトリはpipx -h実行時にも表示される。

シェルの設定で環境変数PATHに特定のディレクトリを含めておく必要がある

前述の$PIPX_BIN_DIR(未定義時[ホームディレクトリ]/.local/bin/)のディレクトリは、インストールした実行ファイルをコマンドとしての(パス名ではない)形で実行できるようにシェルの環境変数PATHに含めておく必要がある。

設定の記述は端末シェルによって異なるので、ここでは扱わない。

pipxにはensurepathを指定して実行することでPATHに追加済みかどうかをチェックする機能がある。

(実行用シンボリックリンクのディレクトリがPATHに入っているかをチェックして結果を表示)
$ pipx ensurepath
使用したバージョン:
  • Python 3.11.2
  • pipx 1.1.0