Python で環境変数を読み込む際の Tips
Python で環境変数を読むときの書き方をメモっておきます。
環境変数の取得方法
- 取得方法は 3 つあります。
os.getenv(name: str) -> Optional[str]
os.environ[name: str] -> str # or raise KeyError
os.environ.get(name: str) -> Optional[str]
- いずれも値を取得できた場合、必ず str 型で返却します。
-
os.getenv
とos.environ.get
に違いはありません。個人的には文字数の少ない前者(os.getenv)を推奨します。
import os # 以降、省略します
# 値がない場合に None を返す
os.environ.get('HOME')
# '/home/user'
os.getenv('UNKNOWN_ENV')
# None
# 値がない場合に KeyError 発生
os.environ['UNKNOWN_ENV']
# => KeyError: 'UNKNOWN_ENV'
基本
初期値
-
os.getenv(name: str, default: str)
で初期値をセットすることができます。 - 初期値には str 型以外の値もセットできますが、os.getenv() の結果は必ず str 型 ですので、通常は合わせるべきです。os.getenv() の外で型を変換します。
os.getenv('MESSAGE', 'hello')
# 'hello'
num = int(os.getenv('NUMBER_ENV', '5'))
print(num, type(num)
# 5, <class 'int'>
フラグ
- bool 型の値を扱う際は、以下のようにするとスマートです。
-
True に該当しなければ False (もしくは、 False に該当しなければ True)という設計がよいかと思います。
- 必要に応じて、True/False/それ以外は例外 という設計にします。
- 様々なケースに対応した書き方をのせているので、必要なパターンをお使いください。
# 以下、環境変数 'FLAG' をフラグとする。
# True とみなす文字以外は False とする
os.getenv('FLAG', 'False') == 'True' # 'True' のみ True
os.getenv('FLAG', 'F') == 'T' # 'T' のみ True
# 大小問わず true 以外は False とする
os.getenv('FLAG', 'False').lower() == 'true'
# True : 'true', 'TRUE', 'True', ...
# False : 他。セットしていない場合も含む。
# true/false/エラー
os.environ['FLAG'] == 'true'
# True : 'true'
# False : 'false'
# 他は KeyError
# 初期値あり
{'true': True, 'false': False}[os.getenv('FLAG', 'false')]
# True となる値: 'true'
# Falseとなる値: 'false', セットしていない
# 他は KeyError
# 初期値あり、エラーなし
os.getenv('FLAG', 'false') == 'true'
# True : 'true'
# False : 他。セットしていない場合も含む。
# 1, 0 をフラグとする
bool(int(os.getenv('FLAG')))
# True : '1'
# False : '0'
# 他は ValueError (int に変換できないため)
# 1, 0 をフラグとして初期値は False
bool(int(os.getenv('FLAG'), '0'))
# True : '1'
# False : '0', セットしていない
# 他は ValueError (int に変換できないため)
# いろんなパターンに対応した True
os.getenv('FLAG', 'False').lower() in ['t', 'true', '1']
# True : '1', 't', 'T', 'true', 'True', 'TRUE', ...
# False : 他
# いろんなパターンに対応しつつ、不明な値で例外
bool({'t': 1, 'true': 1, 'f': 0, 'false': 0}[os.getenv('FLAG')])
# True : 't', 'T', 'true', 'True', 'TRUE', ...
# False : 'f', 'F', 'false', 'False', 'FALSE', ...
# 他は KeyError
ファイルパスからファイル読み込み
- 1 行で書けます。
# 文字列として読み込む
content: str = open(os.getenv('FILE_PATH'), 'r', encoding='UTF-8').read()
# 初期値あり
content: str = open(os.getenv('FILE_PATH', 'file.txt'), 'r', encoding='UTF-8').read()
# JSON ファイルを dict として読み込み
import json
config: dict = json.load(open(os.getenv('CONFIG_PATH', 'config.json'), 'r', encoding='UTF-8'))
# CSV ファイルを list[list[str]] で読み込み
import csv
[r for r in csv.reader(open(os.getenv('CSV_DATA', 'data.csv'), 'r', encoding='UTF-8'))]
# CSV ファイルを 1 行ずつ list[str] で読み込み
for row in csv.reader(open(os.getenv('CONFIG_PATH', 'test.csv'), 'r', encoding='UTF-8'):
print(row)