はじめに
- 以前、ラズパイzero2wでHATを動かしてみたんだけど、ledの光り方が不安定だったから、ラズパイ5ではどうだろうかと思って同じようにインストールしようとしたら怒られた。
- zero2wのOSはlegacy_64bitだったけど、ラズパイ5では最新版にしたから、怒られたっぽい。
- PEP668を見ろ!といわれたからググってみたら、日本人のいないところで決まった話なのね。悲しいね。
- つまるところ、debian系osのパッケージインストール管理システムは、apt(Advanced Packaging Tool)が最上位であるところ、python用の類似システムpip(Pip Installs Python)が有り、パッケージ管理が重層化してエラーが起きやすくなったため、pipが仮想環境内に限定したパッケージ管理に引き下げられたと言うことかな。
反省会① 【仮想環境を整える】
- 言われたとおり、仮想環境をつくる。
- 作り方の説明は以下の通り。
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してみた。
- 上記で、「testENV」は実験用に丸ごと捨てられるようにmkdirして作った普通のフォルダ。「env1_dir」は、前記のvenvコマンドを使って生成された仮想環境に必要なファイルが格納されたフォルダ。
source
コマンドは、シェルファイルをカレントシェルで実行する(?)というコマンドらしいが、いまいち、よく分からない。とりあえず、シェルのお外に出ないという意味かな?このコマンドを使って、env1_dir/bin/activateを実行すると、仮想環境が立ち上がり、プロンプトに(env1)が追加された。 - なお、env1は
--system-site-packages
ありで仮想環境を作ったので、pipのlistもフルで見れる。
- 次は、
--system-site-packages
なしで仮想環境env2を作った。
- 当然、env2のpipはシステムワイドにおけるパッケージに比べてスッカスカ。
- ここまでの流れを読めば、理解したかと思うけど、pipやpythonなどをコールしたときに、
env1_dir/bin
やenv2_dir/bin
の下のpip等を呼び出せるようにするのが、先ほどのsourceコマンドによるactivateとなる。 - env2をactivateした後、ホームディレクトリでpipをコールしてパッケージを見ると、こんな感じ。呼び出されたのは、~/testENV/env2_dir/bin/pipと分かる。
- ここで、sudoで呼ぶと、(env2)が表示されていても、ルートの/bin/pipが呼び出されてしまうので注意。
反省会② 【古いパッケージ】
- 仮想環境にてパッケージのインストールが成功したけど、お小言を貰っている。
setup.py install
メソッドというダサい方式でインストールされているけど、それは、pyproject.toml
を持ってないし、wheel
パッケージはインストールされなかった、と...なんのこっちゃ。- 少し調べてみると、wheelというのは配布用のパッケージ形式を表し、これが現在の標準形らしい。(少し前は、eggという形式もあったが下火の模様)
- pyproject.tomlの.tomlは設定ファイルの書き方の標準形なので、ファイル自体も設定ファイルなのだろう。配布パッケージは必ず含まれるファイルかと思われる。
- setup.py installメソッドとは、pipより昔に使われてたパッケージ管理システム「Distutils」に準拠してインストールする際の手順が記載されたスクリプト「setup.py」を利用したインストール方法らしい。そして、Distutilsパッケージ全体の使用は非推奨 (deprecated) であり、Python 3.12 で削除されるとのこと。
- 4月にリリースされた24.04のubuntuにインストールされているpythonは既に3.12だから、タイムリーな話だね。旧方式は自由度が高すぎて、パッケージ管理上の収拾が付かなくなったから廃止されたのね。便利さと自由さはトレードオフの関係なんだなぁ。
- そして、悲しいことに、パッケージが古いとか言う次元と別に、ライブラリを作った人のgithubのスレッドで、ラズパイ5に対応できてないことについて、去年の11月から継続して議論中だった。駄目だこりゃ!
- でも、こういうスレッドでの英語での盛り上がりを見ると、日本語でこの手の盛り上がりのあるHPがないことに寂しさを感じるね。まぁ、ラズパイの日本語利用ユーザーは3%程度だしね。
終わりに
- 結局、パッケージ自体(rpi_ws281x) がラズパイ5に未対応なので、どうしようもなかった。
- でもまぁ、仮想環境やパッケージ管理の勉強が出来たから、良しとしよう。