zaki work log

作業ログやら生活ログやらなんやら

[PEP 668 回避 / Python] Ubuntu 24.04でpipを仮想環境外でシステムワイドに使う

他のディストリビューションだとpython3-pipパッケージをインストールすればvenvなどの仮想環境無しでもpipを使ってPythonパッケージやコマンドをインストールできるが、Ubuntu 24.04はpython3-pipパッケージがなく (4/27 訂正: apt-get updateしたらpython3-pipパッケージあった…早とちり) PEP 668をしっかり守るような構成になっている。

peps.python.org

あるべきpipの使い方 -> venv使おう

仮想環境をvenvとかで作成すれば普通に使える。

$ python3 -m venv my-env
$ . my-env/bin/activate
(my-env) $ pip list
Package Version
------- -------
pip     24.0

仮想環境外でpipを使いたい場合

ストレートにpipを単体でインストールする。

pip.pypa.io

手順としてはget-pip.pyをダウンロードし、Pythonスクリプトとして実行すれば良いが、前述PEP 668によってエラーになる。

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.12/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.

このエラーはメッセージに書かれている通り--break-system-packagesを付与して実行すれば「OSのパッケージ管理との競合やシステム管理用Pythonへの影響があるかもしれない」けどそれを無視(つまりPEP 668を無視して)してpipをインストールできる。
rootで実行すれば/usr/local/binへ、ユーザー権限であれば~/.local/binへ入る。

というわけで、 制約と誓約を全て理解した上でシステムワイドにpipをインストールするには以下の通り。

$ curl -sS https://bootstrap.pypa.io/get-pip.py | sudo python3 - --break-system-packages
Collecting pip
  Downloading pip-25.1-py3-none-any.whl.metadata (3.6 kB)
Downloading pip-25.1-py3-none-any.whl (1.8 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 20.1 MB/s eta 0:00:00
Installing collected packages: pip
Successfully installed pip-25.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.

$ which pip
/usr/local/bin/pip

インストールできたらあとは普通にpipを実行すればよい…と思いきや、pipを使ったパッケージインストールもPEP 668の影響を受ける。
通常仮想環境外のpipを使ったパッケージは/usr/local~/.localへインストールされるが、この場合も--break-system-packagesを付与する。(非rootのユーザーディレクトリ以下へのインストールも含む)

$ pip install boto 
error: externally-managed-environment

× This environment is externally managed
:
:
$ pip install boto --break-system-packages
Defaulting to user installation because normal site-packages is not writeable
Collecting boto
  Downloading boto-2.49.0-py2.py3-none-any.whl.metadata (7.3 kB)
Downloading boto-2.49.0-py2.py3-none-any.whl (1.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 10.1 MB/s eta 0:00:00
Installing collected packages: boto
Successfully installed boto-2.49.0