Python os.getenv()とは?環境変数を安全に取得する方法
Pythonのos.getenv()は、環境変数を安全に取得する関数です。
環境変数が設定されていなくてもエラーにならず、デフォルト値を返せるのが特徴です。
os.getenv()の基本的な使い方
import os
print(os.getenv("PATH"))
実行結果(例):
/usr/local/bin:/usr/bin:/bin
設定されていない場合はNoneが返ります。
import os
print(os.getenv("NO_SUCH_VAR"))
実行結果:
None
エラーにはなりません。この点がos.environ["..."]との最大の違いです。
デフォルト値を指定する
import os
print(os.getenv("PORT", "8000"))
print(os.getenv("HOST", "localhost"))
実行結果(未設定の場合):
8000
localhost
第2引数が環境変数がないときの値になります。設定ファイルの既定値を書く感覚で使えます。
import os
config = {
"host": os.getenv("DB_HOST", "localhost"),
"port": int(os.getenv("DB_PORT", "5432")),
"debug": os.getenv("DEBUG", "false").lower() == "true",
}
print(config)
実行結果(すべて未設定の場合):
{'host': 'localhost', 'port': 5432, 'debug': False}
「環境変数があればそれを、なければ既定値を」という設定の組み立てが、この形で完結します。
os.environ.get()と同じもの
import os
print(os.getenv("PORT", "8000"))
print(os.environ.get("PORT", "8000"))
この2つはまったく同じ動作です。os.getenv()は内部でos.environ.get()を呼んでいるだけです。
| 書き方 | 未設定のとき |
|---|---|
os.environ["KEY"] |
KeyError |
os.environ.get("KEY") |
None |
os.getenv("KEY") |
None |
os.getenv("KEY", "既定値") |
既定値 |
どちらを使うかは好みですが、取得だけならos.getenv()のほうが短く意図が明確です。設定もしたい場合はos.environを使うことになります。
os.environについては「Python os.environとは?環境変数を辞書のように扱う方法」をご覧ください。
必須の設定にデフォルト値を使わない
os.getenv()は便利ですが、使うべきでない場面があります。
import os
# NG: APIキーに仮の値を入れてしまう
api_key = os.getenv("API_KEY", "dummy")
この書き方だと、設定漏れに気づかないまま動き続けます。実際にAPIを呼ぶ段階になって、原因の分かりにくい認証エラーが出ます。
なければ動かせない設定は、その場で止めるのが正解です。
import os
api_key = os.getenv("API_KEY")
if api_key is None:
raise SystemExit("環境変数 API_KEY を設定してください")
print("APIキーを読み込みました")
あるいはos.environ[]で読んでKeyErrorを起こす方法もあります。
| 設定の性質 | 書き方 |
|---|---|
| あると嬉しい(ポート番号など) | os.getenv("PORT", "8000") |
| ないと動かない(APIキーなど) | os.environ["API_KEY"]または明示的に停止 |
空文字に注意
import os
os.environ["API_KEY"] = ""
print(repr(os.getenv("API_KEY", "既定値")))
実行結果:
''
空文字が設定されている場合、デフォルト値は使われません。「設定されている」と判断されるためです。
環境変数を空で定義してしまうミスは珍しくありません。空も未設定として扱いたいなら、次のように書きます。
import os
api_key = os.getenv("API_KEY") or "既定値"
print(api_key)
実行結果:
既定値
orを使うと、Noneも空文字もまとめて既定値に置き換えられます。
戻り値は必ず文字列
import os
os.environ["PORT"] = "8080"
port = os.getenv("PORT")
print(type(port))
print(port + 1)
実行結果:
<class 'str'>
TypeError: can only concatenate str (not "int") to str
数値として扱うには明示的な変換が必要です。
import os
port = int(os.getenv("PORT", "8000"))
print(port + 1)
実行結果:
8081
デフォルト値も文字列で書くのがポイントです。os.getenv("PORT", 8000)と数値を渡すと、未設定のときだけ型が変わってしまいます。
import os
# 統一されない書き方
v = os.getenv("NO_SUCH", 8000)
print(type(v)) # 未設定なら int、設定済みなら str
変換の失敗にも備える
import os
os.environ["PORT"] = "abc"
try:
port = int(os.getenv("PORT", "8000"))
except ValueError:
raise SystemExit("PORT には数値を指定してください")
環境変数は人が手で書くものです。タイプミスを前提に、変換エラーを受け止めておくと親切です。
実行時に設定を切り替える
import os
env = os.getenv("APP_ENV", "development")
if env == "production":
debug = False
db = os.environ["DATABASE_URL"]
else:
debug = True
db = os.getenv("DATABASE_URL", "sqlite:///dev.db")
print(f"環境: {env} / デバッグ: {debug}")
実行結果(未設定の場合):
環境: development / デバッグ: True
本番だけ必須、開発では既定値という書き分けができます。同じコードのまま、環境変数だけで動作を変えられるのが環境変数を使う目的です。
詳しくは「Python configparserとは?設定ファイルを読み書きする方法」で解説しています。
os.getenv()のまとめ
os.getenv()は環境変数を取得し、なければNoneを返す- 第2引数でデフォルト値を指定できる
os.environ.get()とまったく同じ動作- 必須の設定にデフォルト値を使わない(設定漏れに気づけなくなる)
- 空文字はデフォルト値に置き換わらない。
orで補う - 戻り値は文字列。数値は
int()、デフォルト値も文字列で書く - 変換失敗(
ValueError)にも備える
あわせて読みたい
- Python os.environとは?環境変数を辞書のように扱う方法
- Python os.getcwd()とは?カレントディレクトリを取得する方法
- Python os.path.join()とは?パスを安全に連結する方法
- Python環境変数の設定と取得方法完全ガイド|Windows・Mac・Linux対応
- Python os メンバー一覧|関数・クラス・定数をカテゴリ別に解説
- Python os関数一覧|ファイル・フォルダ操作で使う関数をまとめて解説




