🔗

Raspberry Pi OSのPython仮想環境内でgpiozeroを使うには

2024/03/26に公開

結論

Raspberry Pi OSのPython仮想環境内でgpiozeroを使う場合、venv--system-site-packagesオプションを使うとうまくいきます。

$ mkdir testenv        
$ cd testenv 
$ python -m venv .env --system-site-packages
$ source .env/bin/activate
(以降、仮想環境内でgpiozeroを使える)

※ 正確には、システムのPythonにインストールされているパッケージはすべて使える状態になります。

このコマンドを実行した環境は以下の通りです。

  • Raspberry Pi 5
  • Raspberry Pi OS (64 bit) 12.5 bookworm
  • Python 3.11.2

背景と課題

最新のRaspberry Pi OS (Bookworm)では、pip installでシステムワイドにパッケージをインストールできなくなっています。

以下のような感じでエラーになります。

$ pip install buildhat
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.

  For more information visit http://rptl.io/venv

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.

というわけで、pipでパッケージをインストールしたい場合、仮想環境を使うことが推奨されています。

※ この辺りの詳細な話は公式ドキュメントを参考にしてください。
https://www.raspberrypi.com/documentation/computers/os.html#about-python-virtual-environments


しかしながら、GPIO制御用ライブラリのgpiozeroを仮想環境にインストールして使おうとすると、エラーになってしまいます。

$ mkdir testenv
$ cd testenv 
$ python -m venv .env
$ source .env/bin/activate
.env $ pip install gpiozero
.env $ python
Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from gpiozero import LED
>>> led = LED(17)
(略)
gpiozero.exc.BadPinFactory: Unable to load any default pin factory!

依存するパッケージを個別にインストールする必要があるようですが、エラー文言からは必要なパッケージが把握できず、お手上げでした😇

解決策

エラー文言でググってみたら、同じような問題に言及しているissuesが見つかりました。「初心者が混乱しない?」という質問に対して、「すでに公式ドキュメントに言及されているよ」とのことでした。

https://github.com/raspberrypi/documentation/issues/3220

公式ドキュメントを見たところ、--system-site-packagesオプションをつけてvenvを実行すると、システムのPythonにインストールされているパッケージを使えるようになることがわかりました。

NOTE
If you want to inherit the currently installed packages from the system Python, you should create your virtual environment using python -m venv --system-site-packages env.

冒頭に紹介したようにコマンドを実行すると、仮想環境内でgpiozeroを使えるようになりました。

追加のパッケージをインストールしたい場合、仮想環境内でpip installを実行すればOKです。

GitHubで編集を提案

Discussion