ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Debian 12(bookworm)のpython3のpipがエラーを吐くのでpipxを使ってみた

(2023-12-26 初稿 - )

事前の準備

まずは、以下のパッケージをインストールして、pip3を使える状態にしておく。

$ sudo apt install python3-pip

症状

Debian 12(bookworm)になって、pip3でpythonのパッケージをインストールしようとすると怒られる。

$ pip3 install pycowsay
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.

なんじゃこの蚊帳の外感、あるいは疎外感。(^_^;)

で、調べてみると、ちゃんとDebianのサイトにアップグレード後も影響がある項目の「5.2.2. python インタプリタは externally-managed としてマークされます」に記載がある(ちゃんと、読みましょう > 自分)。

上記の記述では、pipx、venv、virtualenvがあるが、とりあえず pipx を利用してみることにする。

pipxを使ってみる

$ sudo apt install pipx

pipxをインストールしたら、以下のコマンドでpathの設定を行う。

$ pipx ensurepath

具体的には、.profileに以下のパスが控えめに一番最後に追加してくれた。

# Created by `pipx` on 2023-12-25 05:59:30
export PATH="$PATH:/home/hoge/.local/bin"

準備が整ったので、練習で Hellow-World-Package をインストールしてみる。

$ pipx install Hellow-World-Package

さっそく実行してみる。

$ hello-word
Hello, World!

おお、pipxのおかげで、また新しい世界が開けた。\(^o^)/

で、hello-world コマンドは、以下のところにシンボリックリンクがあり、その実態は、以下のようだ。

$ ls -l $(which hello-world)
lrwxrwxrwx 1 hoge hoge 64 12月 25 15:10 /home/hoge/.local/bin/hello-world -> /home/hoge/.local/pipx/venvs/hello-world-package/bin/hello-world

なんと、pipx/venvsの下にディレクトリを作り、その中のbinディレクトリに実行ファイルを作ってくれている。

これなら、パッケージ管理の混乱が起きそうにないな…

あるプロジェクトにさらにパッケージを追加するのは、以下のように inject を使うようだ。

例として、Hellow-World-Package に pycowsay を追加するときは、以下のとおり。

$ pipx inject Hellow-Workd-Package pycowsay

上記のようにすると、.local/binには、hello-worldコマンドしかない。

$ ls .local/bin/
hello-world

しかし、hello-world-packageのbinには pycowsayが入っている。

$ ls .local/pipx/venvs/hello-world-package/bin/
Activate.ps1  activate.csh   hello-world  python   python3.11
activate      activate.fish  pycowsay     python3

ちょっと、無理やり感が否めないけど、以下のコマンドを入力すれば、牛がHello, World!と鳴いてくれる。

$ ./.local/pipx/venvs/hello-world-package/bin/pycowsay $(hello-world)
  -------------
< Hello, World! >
  -------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||

おお、これぞ、新世界!  Hello, World!にふさわしい。(^^ゞ

 

関連ページ