8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python で環境変数を読むときのいろいろ

Last updated at Posted at 2021-01-25

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.getenvos.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)
8
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?