(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!にふさわしい。(^^ゞ