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)にも備える

あわせて読みたい


configparser の解説

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら