📚

オフラインのRaspberry Pi OSでpython-dotenvを使う

2023/12/13に公開

少し前にRaspberry Pi OS Bookwormがリリースされました。

https://akkiesoft.hatenablog.jp/entry/20231012/1697120720

長らくオフラインのRaspberry Pi Zero WHにRaspberry Pi OS Bullseyeを入れて使用していたので、これを気にmicroSDを焼きなおそうかと思いながら新機能を見ても、アップデート内容がRaspberry Pi 4/5に関する内容ばかりです。

https://downloads.raspberrypi.org/raspios_armhf/release_notes.txt

Raspberry Pi Zero WHにOSイメージを焼きなおすモチベーションを探していたところ、どうやらRaspberry Pi OS Bookwormになってからpython-dotenvがデフォルトでインストールされるようになったことに気づきました。

diff

https://github.com/theskumar/python-dotenv

パッケージリストはDistroWatchから取得しました。

https://distrowatch.com/table.php?distribution=raspios

というわけでやっていきましょう。

まずはRaspberry Pi Imagerを再インストールしてバージョンアップします。

https://www.raspberrypi.com/software/

imager

数年ぶりにバージョンアップしたのでなんかもうめっちゃ変わった。

まあそれはそれとして、デバイスを選択します。

device

Raspberry Pi Zero WHデバイス選択した場合、OS一覧にRaspberry Pi OS Bookwormが出てこなくなるので、No filteringを選びます。

Raspberry Pi OS BookwormはRaspberry Pi Zero WHでは動きますがあまり動きません。

例えばRaspberry Pi Zero WHで動かすRaspberry Pi OS BookwormにインストールされているChromiumとFirefoxを動かすと、Raspberry Pi Zero WHには対応していないみたいなメッセージが出て、オフラインで使えるブラウザがdilloしかない状況になるので気をつけましょう。

os

次はOSを選択します。Raspberry Pi Zero WHはarmhfなので32bit版を選択しましょう。

今回は以下アップデートがあった最新バージョンをインストールします。

https://akkiesoft.hatenablog.jp/entry/20231207/1701925940

後はmicroSDを選択して色々選択してOSイメージを焼くだけです。

OSイメージを焼いたらRaspberry Pi Zero WHへ差し込んで電源投入していつものセットアップ画面を進めていきましょう。

初期設定項目はBullseyeからほとんど変わりませんが、BookwormはデフォルトブラウザをChromiumとFirefoxどちらにするか質問してきます。
スキップできないのでビアンカとフローラもびっくりですね。

セットアップを終えたら以下のような画面になります。
ここ数年で最高の壁紙(個人の感想)

pi

ターミナルを開いてPythonのバージョンを確認します。

$ python -V
Python 3.11.2

python-dotenvがインストールされているか確認します。

$ dotenv --version
bash: dotenv: command not found

びっくりしましたね。
実はRaspberry Pi OS Bookwormにインストールされているpython-dotenvはパスにコマンドがありません。

なのでこうやって呼び出します。

$ python -m dotenv --version
python -m dotenv, version 0.21.0

オフラインのRaspberry Pi OSでdotenvコマンドが使いたい場合はひと工夫必要ですが、ここでは解説しません。

ヘルプを確認しましょう。

$ python -m dotenv --help
Usage: python -m dotenv [OPTIONS] COMMAND [ARGS]...

  This script is used to set, get or unset values from a .env file.

Options:
  -f, --file PATH                 Location of the .env file, defaults to .env
                                  file in current working directory.
  -q, --quote [always|never|auto]
                                  Whether to quote or not the variable values.
                                  Default mode is always. This does not affect
                                  parsing.
  -e, --export BOOLEAN            Whether to write the dot file as an
                                  executable bash script.
  --version                       Show the version and exit.
  --help                          Show this message and exit.

Commands:
  get    Retrieve the value for the given key.
  list   Display all the stored key/value.
  run    Run command with environment variables present.
  set    Store the given key/value.
  unset  Removes the given key.

なるほどわからん。
早速.envファイルを作成し、環境変数を追加してみましょう。

$ python -m dotenv set FOO 123456
FOO=123456

setコマンドで.envファイルに環境変数を追加したいとき、カレントディレクトリに.envファイルが無ければ自動的に作成してくれます。

$ cat .env
FOO='123456'

わざわざシングルクォーテーションで囲ってくれるんですね。
このような処理が不要であればヘルプで出てきたオプションでautoやneverをつけてあげます。

$ python -m dotenv -q auto set BAR 123456
BAR=123456
$ cat .env
FOO='123456'
BAR=123456

いいですね。
.envファイルから環境変数を削除してみましょう。

$ python -m dotenv unset FOO
Successfully removed FOO
$ cat .env
BAR=123456

削除できました。

$ python -m dotenv set FOO 123456
$ cat .env
BAR=123456
FOO='123456'
$ python -m dotenv list
BAR=123456
FOO=123456

今までcatコマンドで.envの中身を確認してきましたが、listコマンドでも.envにセットした環境変数を確認できます。

$ python -m dotenv list --format json
{
  "BAR": "123456",
  "FOO": "123456"
}

JSONフォーマットを指定すればJSONになります。それはそう。
フォーマットはsimple|json|shell|exportの中から選択できます。

変数のみを取り出す場合はgetコマンドを使用します。

$ python -m dotenv list get FOO
123456

以上、4つのコマンドを紹介してきましたが、これらのコマンドを使うことは非常に少ないので一旦忘れてください。

そんなわけで最強コマンドrunを紹介します。

$ lua -e "print(os.getenv('FOO'))"
nil
$ python -m dotenv run lua -e "print(os.getenv('FOO'))"
123456

なんと無から有を生み出すことに成功しました!!
今回は別言語のLuaで紹介しましたが、コマンドなら何でも動くと思うので好きなコマンドにちょい足しするだけで簡単に.envの環境変数を渡すことができます!!

皆さん今日はこれだけでも覚えて帰ってくださいね(紹介が遅い)
ではでは、Raspberry Pi OS Bookwormで新しく追加されたpython-dotenvをオフラインで使ってみてください。


そういえば全く紹介していませんでしたが、この使い方は皆さんご存知ですよね。

import os
from dotenv import load_dotenv

load_dotenv()

print(os.getenv("FOO"))

Discussion