オフラインのRaspberry Pi OSでpython-dotenvを使う
少し前にRaspberry Pi OS Bookwormがリリースされました。
長らくオフラインのRaspberry Pi Zero WHにRaspberry Pi OS Bullseyeを入れて使用していたので、これを気にmicroSDを焼きなおそうかと思いながら新機能を見ても、アップデート内容がRaspberry Pi 4/5に関する内容ばかりです。
Raspberry Pi Zero WHにOSイメージを焼きなおすモチベーションを探していたところ、どうやらRaspberry Pi OS Bookwormになってからpython-dotenvがデフォルトでインストールされるようになったことに気づきました。
パッケージリストはDistroWatchから取得しました。
というわけでやっていきましょう。
まずはRaspberry Pi Imagerを再インストールしてバージョンアップします。
数年ぶりにバージョンアップしたのでなんかもうめっちゃ変わった。
まあそれはそれとして、デバイスを選択します。
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を選択します。Raspberry Pi Zero WHはarmhfなので32bit版を選択しましょう。
今回は以下アップデートがあった最新バージョンをインストールします。
後はmicroSDを選択して色々選択してOSイメージを焼くだけです。
OSイメージを焼いたらRaspberry Pi Zero WHへ差し込んで電源投入していつものセットアップ画面を進めていきましょう。
初期設定項目はBullseyeからほとんど変わりませんが、BookwormはデフォルトブラウザをChromiumとFirefoxどちらにするか質問してきます。
スキップできないのでビアンカとフローラもびっくりですね。
セットアップを終えたら以下のような画面になります。
ここ数年で最高の壁紙(個人の感想)
ターミナルを開いて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