HOWTO · Python
Python スクリプトで環境変数を設定する
通常、環境変数はシステム内で手動で設定されますが、Python スクリプトを使用して環境変数と対話します。
このページの内容
Python では os.environ マッピングを通じて環境変数を扱えます。キーを指定して値を読み取る、利用可能なキーを反復処理する、PATH を OS ごとの区切り文字で分割するといった操作ができます。このマッピングへの代入で、実行中のプロセスの値を設定または変更できます。
コードと出力の例は原文どおりに保持されます。出力に表示される development と production は英語表記のままです。
Python で環境変数を読み取る
キーが存在しない場合に備えて代替値を指定するには、os.environ.get() を使います。os.environ["APP_MODE"] のような角括弧による参照は、キーが存在すると想定できる場合に適しています。キーがなければ KeyError が発生します。この例では読み取り前に予測可能な値を設定するため、実行環境から引き継いだマシン固有の値に依存しません。
import os
os.environ["APP_MODE"] = "development"
print(os.environ["APP_MODE"])
利用可能な名前を調べるには、os.environ を反復処理するか、os.environ.items() を呼び出してキーと値を取得します。マッピングには認証情報などの機密設定が含まれることがあるため、共有ログに全内容を出力するのは避けてください。特定の値を取得するには、os.environ.get("APP_MODE", "development") のように指定すると、キーが設定されていない場合に代替値を返します。
PATH は、コマンドの検索に使うディレクトリの並びを格納する環境変数です。区切り文字は OS によって異なるため、os.pathsep を使って分割します。たとえば、os.environ.get("PATH", "").split(os.pathsep) とします。各項目はプロセスがコマンドを検索するのに役立ちますが、インストール済みのすべてのプログラムを特定できるわけではなく、ファイルの正確な場所を保証するものでもありません。
.env ファイルはプレーンテキストです。Python が自動的に読み込むことはなく、キーを書き込むだけで秘密情報が保護されるわけでもありません。必要に応じて適切なローダーやデプロイ設定を使い、ファイル自体へのアクセスも別途制限してください。
Python で環境変数を設定する
os.environ マッピングを使うと、変数を作成したり、現在の値を置き換えたりできます。環境変数の値は文字列なので、数値などを代入するときは文字列に変換してください。以降のセクションでは、直接代入する方法と、既存の値を維持しながら既定値を設定する方法を説明します。
os.environ で環境変数を設定または変更する
os.environ["APP_MODE"] に代入すると値が設定され、同じキーにもう一度代入すると値が変更されます。この例は単独で実行でき、更新後の値を出力します。
import os
os.environ["APP_MODE"] = "development"
os.environ["APP_MODE"] = "production"
print(os.environ["APP_MODE"])
このマッピングが表すのは、現在のプロセスの環境です。実行中の Python プログラムが設定した値は、その後に起動する子プロセスにも引き継がれることがあります。一方、親シェルの値は変わらず、プログラム終了後もシステムに値が残るわけではありません。Python の起動前から値を利用できるようにするには、シェル、サービス設定、または別の起動元で設定してください。
os.environ.setdefault で既定値を設定する
os.environ.setdefault(key, default) を呼び出すと、キーが存在しない場合に限り既定値が追加されます。キーがすでに存在する場合、setdefault は現在の値を返し、その値を変更しません。値を置き換えたい場合は代入を使います。
import os
mode = os.environ.setdefault("APP_MODE", "development")
print(mode)
呼び出し元、シェル、またはデプロイ設定から値を指定できるようにしつつ、省略可能な設定に代替値を用意したい場合に便利です。os.environ へのほかの代入と同じく、変更が適用されるのはこのプロセスと、その後に起動する子プロセスです。
まとめ
os.environ から値を読み取り、既存の設定を維持しながら代替値を使う場合は os.environ.setdefault を、値を置き換える場合は直接代入を使います。Python で行った変更はそのプロセスと起動した子プロセスに適用され、親シェルやシステムには引き継がれません。