ラズパイに怒られた話【error: externally-managed-environment】

# はじめに
- [以前](https://qiita.com/kei_tnk/items/836c1ed9e70ed8bb5bc2)、ラズパイzero2wで[HAT](https://www.waveshare.com/rgb-led-hat.htm)を動かしてみたんだけど、ledの光り方が不安定だったから、ラズパイ5ではどうだろうかと思って同じようにインストールしようとしたら怒られた。
- zero2wのOSはlegacy_64bitだったけど、ラズパイ5では最新版にしたから、怒られたっぽい。
![スクリーンショット 2024-05-23 14.22.35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/2267b152-a245-5c99-cdd8-e08bba2683b0.jpeg)
- [PEP668](https://peps.python.org/pep-0668/)を見ろ！といわれたからググってみたら、日本人のいないところで決まった話なのね。悲しいね。
![スクリーンショット 2024-05-23 14.25.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/8bdd2d20-ec32-ac21-02ea-4e3af492e618.jpeg)
- つまるところ、debian系osのパッケージインストール管理システムは、[apt(Advanced Packaging Tool)](https://ja.wikipedia.org/wiki/APT)が最上位であるところ、python用の類似システム[pip(Pip Installs Python)](https://ja.wikipedia.org/wiki/Pip)が有り、パッケージ管理が重層化してエラーが起きやすくなったため、pipが仮想環境内に限定したパッケージ管理に引き下げられたと言うことかな。

# 反省会①　【仮想環境を整える】
- 言われたとおり、仮想環境をつくる。
- 作り方の[説明](https://docs.python.org/3/library/venv.html)は以下の通り。
```bash
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

positional arguments:
  ENV_DIR               A directory to create the environment in.

optional arguments:
  -h, --help            show this help message and exit
  --system-site-packages
                        Give the virtual environment access to the system
                        site-packages dir.
  --symlinks            Try to use symlinks rather than copies, when symlinks
                        are not the default for the platform.
  --copies              Try to use copies rather than symlinks, even when
                        symlinks are the default for the platform.
  --clear               Delete the contents of the environment directory if it
                        already exists, before environment creation.
  --upgrade             Upgrade the environment directory to use this version
                        of Python, assuming Python has been upgraded in-place.
  --without-pip         Skips installing or upgrading pip in the virtual
                        environment (pip is bootstrapped by default)
  --prompt PROMPT       Provides an alternative prompt prefix for this
                        environment.
  --upgrade-deps        Upgrade core dependencies (pip) to the
                        latest version in PyPI

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.
```
- ググってみると、`--system-site-packages`オプション(システムワイド環境にあるパッケージを読み込む)を付けておいた方が良さげとの意見もあるけど、一から環境を構築した方がエラーの原因がつかみやすいということもあるから、自分としては付けない方をおすすめするかな。最近はmicroSDカードも高速なカードの販売下限が32GBくらいなイメージだから、容量に不安があるってこともないだろうし。
- また、`--prompt`オプションを付けると、仮想環境中であることを示すプロンプトが表示されるとのこと。
- 実際に仮想環境を作ってから、仮想環境をactivateしてみた。
![スクリーンショット 2024-05-23 15.30.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/ae494ca4-dec3-aec5-dc1d-ad9b15e33cf7.jpeg)
- 上記で、「testENV」は実験用に丸ごと捨てられるようにmkdirして作った普通のフォルダ。「env1_dir」は、前記のvenvコマンドを使って生成された仮想環境に必要なファイルが格納されたフォルダ。`source`コマンドは、シェルファイルをカレントシェルで実行する(?)というコマンドらしいが、いまいち、よく分からない。とりあえず、シェルのお外に出ないという意味かな？このコマンドを使って、env1_dir/bin/activateを実行すると、仮想環境が立ち上がり、プロンプトに(env1)が追加された。
- なお、env1は`--system-site-packages`ありで仮想環境を作ったので、pipのlistもフルで見れる。
![スクリーンショット 2024-05-23 17.50.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/e89d65bb-9257-df55-4b39-4c30f75d4aa5.jpeg)
- 次は、`--system-site-packages`なしで仮想環境env2を作った。
![スクリーンショット 2024-05-23 17.47.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/15edb450-7ada-b110-cf58-8dabd10d0cae.jpeg)
- 当然、env2のpipはシステムワイドにおけるパッケージに比べてスッカスカ。
![スクリーンショット 2024-05-23 17.42.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/cb885520-dc6f-b466-38a1-b39c2bdd9d42.jpeg)
- ここまでの流れを読めば、理解したかと思うけど、pipやpythonなどをコールしたときに、`env1_dir/bin`や`env2_dir/bin`の下のpip等を呼び出せるようにするのが、先ほどのsourceコマンドによるactivateとなる。
- env2をactivateした後、ホームディレクトリでpipをコールしてパッケージを見ると、こんな感じ。呼び出されたのは、~/testENV/env2_dir/bin/pipと分かる。
![スクリーンショット 2024-05-23 18.02.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/e5b52ff6-9763-0b2b-7686-e895766465f2.jpeg)
- ここで、sudoで呼ぶと、(env2)が表示されていても、ルートの/bin/pipが呼び出されてしまうので注意。
![スクリーンショット 2024-05-23 18.13.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/3bb3d4d1-478d-813b-0854-117f88c3b67c.jpeg)
![スクリーンショット 2024-05-23 18.18.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/4a90c233-528a-fc7b-a3ef-820633712a85.jpeg)

# 反省会② 【古いパッケージ】
- 仮想環境にてパッケージのインストールが成功したけど、お小言を貰っている。
![スクリーンショット 2024-05-23 18.28.07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/e85dbf03-0865-db40-a92e-20ab61089e4e.jpeg)
- `setup.py install`メソッドというダサい方式でインストールされているけど、それは、`pyproject.toml`を持ってないし、`wheel`パッケージはインストールされなかった、と...なんのこっちゃ。
- 少し調べてみると、wheelというのは配布用のパッケージ形式を表し、これが現在の標準形らしい。（少し前は、eggという形式もあったが下火の模様）
- pyproject.tomlの[.toml](https://ja.wikipedia.org/wiki/TOML)は設定ファイルの書き方の標準形なので、ファイル自体も設定ファイルなのだろう。配布パッケージは必ず含まれるファイルかと思われる。
- setup.py installメソッドとは、pipより昔に使われてたパッケージ管理システム「[Distutils](https://docs.python.org/ja/3.11/distutils/introduction.html)」に準拠してインストールする際の手順が記載されたスクリプト「setup.py」を利用したインストール方法らしい。そして、Distutilsパッケージ全体の使用は非推奨 (deprecated) であり、Python 3.12 で削除されるとのこと。
- 4月にリリースされた24.04のubuntuにインストールされているpythonは既に3.12だから、タイムリーな話だね。旧方式は自由度が高すぎて、パッケージ管理上の収拾が付かなくなったから廃止されたのね。便利さと自由さはトレードオフの関係なんだなぁ。
![スクリーンショット 2024-05-23 20.02.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/371f75da-4b3c-bda1-6c52-fe0a68e24d55.jpeg)
![スクリーンショット 2024-05-23 20.09.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/bd55743b-ed07-a264-0c2d-58058bb38204.jpeg)
- そして、悲しいことに、パッケージが古いとか言う次元と別に、[ライブラリを作った人のgithubのスレッド](https://github.com/jgarff/rpi_ws281x/issues/528)で、ラズパイ5に対応できてないことについて、去年の11月から継続して議論中だった。駄目だこりゃ！
- でも、こういうスレッドでの英語での盛り上がりを見ると、日本語でこの手の盛り上がりのあるHPがないことに寂しさを感じるね。まぁ、[ラズパイの日本語利用ユーザーは3%程度](https://rpi-imager-stats.raspberrypi.com/)だしね。
![スクリーンショット 2024-05-23 19.26.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/cdc978ad-3933-60c1-ef9d-6b7d38dd6825.jpeg)

# 終わりに
- 結局、パッケージ自体(rpi_ws281x) がラズパイ5に未対応なので、どうしようもなかった。
- でもまぁ、仮想環境やパッケージ管理の勉強が出来たから、良しとしよう。