一般ユーザで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