Monologue

日々の考えたこと

Raspberry Pi Zero 2にJupyterLabをインストール

1. 背景

昨年の話になりますが、Raspberry Pi Zero 2 Wを手に入れました。 3000円未満の廉価にもかかわらず、4コアCPUが搭載されているということで爆発的な人気を博した製品です。発売以来、長期に亘って品薄の状態が続いていましたが、昨年の夏頃から供給状態が改善されたようで、今は予約無しで購入できます。

Raspberry Pi Zero 2 W

私も、KSYから2セット入手できたので、しばらく色々と遊んでいました。 値段を考えるとコスパ十分であるものの、各所で指摘されている通り、GUI環境下での使用は厳しい印象です。 Raspberry Pi OSには、ThonnyやGeanyのような軽量なIDEがデフォルトで入っていますが、これらを用いたプログラミングさえも快適とは言い難い状況でした(私が使用しているSDカードの読み込み・書き込み速度が関係しているかもしれませんが)。

故に、CUIでの使用を余儀なくされる訳ですが、実行結果をインタラクティブに確認したい場合にはどうしても不便です。 というわけで、Raspberry Pi Zero 2 W上でJupyterLabを実行し、他のPCからブラウザを通して、Pythonプログラミングを行うことを画策しました。

2. 手順

2.1. OSのインストール

Raspberry Pi Imagerを用いて、SDカードにRaspberry Pi OS Lite(64-Bit)を書き込みました。 なお、書き込み時に、SSHやユーザー名・パスワードの設定、Wi-Fiの設定、ロケールの設定は済ませています。 書き込んだSDカードをボードに挿入・電源を起動。SSHでリモート接続後、sudo apt update, sudo apt upgradeで各種パッケージのアップデートを行いました。

2.2. 各種Pythonパッケージのインストール

2.2.1. pipのインストール

インストール直後は、Pythonのパッケージ管理システム(pip)が入っていないので、下記コマンドでインストールしました。

$ sudo apt install python3-pip

その後、pip --versionを実行し、正常にインストールできているかを確認しました。

2.2.2. JupyterLabのインストール

pipのインストールが無事に済んだので、pip3 install jupyterlabで、JupyterLabのインストールを試みましたが、下記のエラーが発生しました。

error: externally-managed-environment

× This environment is externally managed
mq> 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 installは推奨されていないようです。 --break-system-packageのオプションを付けることで強制的にインストールは可能ですが、今回はエラーメッセージに従って仮想環境を作成しました。

下記コマンドを実行し、jupyterという名前の仮想環境を作成しました(名前は任意でよい)。

$ python3 -m venv jupyter

その後、下記コマンドで、仮想環境を有効にします。

$ source jupyter/bin/activate

仮想環境有効後、JupyterLabをインストールしました。

$ pip3 install jupyterlab

2.2.3. JupyterLabの設定

パスワードの設定を行います。仮想環境下で下記のコマンドを実行し、パスワードを入力します。

$ jupyter lab password

続いて、設定ファイルを生成します。

$ jupyter lab --generate-config

ホームディレクトリ直下に.jupyter(.仮想環境名)というディレクトリが作成されるため、その中の"jupyter_lab_config.py"を編集します。

$ vim ~/.jupyter/jupyter_lab_config.py

今回は、以下の項目について、コメントアウトの解除とパラメータ設定を行いました。

  • 設定項目(jupyter_lab_config.py)
    • c.ExtensionApp.open_browser = False
    • c.ServerApp.allow_remote_access = True
    • c.ServerApp.ip = '*'

設定後、仮想環境上でjupyter labを実行すると、サーバーが起動します。ブラウザから下記のリンクにアクセスすると、見慣れた画面が表示されました。 http://raspberrypi.local:8888/lab

2.2.4. 各種モジュールのインストール

以上で、JupyterLabについての設定は終了しました。引き続き、pipで各種モジュール・パッケージをインストールしました(私の場合、numpy, pandas, matplotlib, RPi.GPIOなど)。仮想環境下なので、Raspberry Pi OSにデフォルトで入っているパッケージもインストールする必要があるので注意です。

$ pip3 install numpy pandas matplotlib RPi.GPIO

3. 動作確認

最後に、Lチカで問題なく動作するかを確認しました。 Raspberry Pi Zero 2 Wの3.3V端子にプルアップ抵抗を経由してLEDのアノードを接続、カソードはGPIO17に接続した上で、下記のコードをノートブックに入力し実行しました。 問題なく動作したので大丈夫でしょう!

import RPi.GPIO as GPIO
import time

LED_PIN = 17

def setup():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED_PIN, GPIO.OUT, initial=GPIO.HIGH)

def main():
    while True:
        print('LED ON')
        GPIO.output(LED_PIN, GPIO.LOW)
        time.sleep(0.5)
        print('LED OFF')
        GPIO.output(LED_PIN, GPIO.HIGH)
        time.sleep(0.5)

def destroy():
    GPIO.output(LED_PIN, GPIO.HIGH)
    GPIO.cleanup()
    
if __name__ == '__main__':
    setup()
    try:
        main()
    except KeyboardInterrupt:
        print('stop')
        destroy()