環境変数を取得して環境毎に設定を切り替える os.environ

ある程度の規模のシステムを開発する場合、アプリケーションはローカル、開発、ステージング、本番など複数の環境で動作することになります。同じlinux環境でもDBの接続先やメールの宛先は環境ごとに変える必要が出てくると思いますが、そんなとき環境変数を利用することが多いのではないでしょうか。このページでは環境変数を取得し、環境ごとに設定を切り替える方法について紹介します。

環境変数を取得する

pythonでは環境変数は osモジュールのos.environに辞書形式で格納されています。辞書形式なので、変数名をキーで指定するか、getメソッドを使用します。サンプルを見てみましょう。

import os

# 環境変数取得(取得できない場合はエラー)
app_env = os.environ["APP_ENV"]
print(app_env)

# 環境変数取得(取得できなくてもエラーにならずNoneが返される)
app_env = os.environ.get("APP_ENV")
print(app_env)

以下はlinuxでのコマンドライン上での実行例ですが、macも同様に動作します。動作確認はしていないのですが、windowsの場合はset=TESTなどとすると動くと思います。

$ APP_ENV=DEV
$ export APP_ENV
$ python sample.py 
$ DEV
$ DEV

exportした変数がpythonコード上で取得できていることが確認できます。

サンプルのコメント上にも記載していますが、指定した環境変数自体がない場合、エラーを発生させたい場合はキーを大カッコで指定します。また、getを使用すると、ない場合はNoneを返します。

環境ごとの切替例

これを利用して環境別に切り替える実装例を示します。仕様は以下のとおりとします。

  • 環境変数APP_ENV=DEVの場合は開発環境
  • 環境変数APP_ENV=STGの場合はステージング
  • 環境変数APP_ENV=PRDの場合は本番環境
  • 環境変数APP_ENV=がない場合や上記以外の場合はローカル環境
import os

def main():
    # 環境変数取得
    app_env = os.environ.get("APP_ENV")
    
    if app_env == 'DEV':
        # 開発環境用の設定を行う
        print('開発')
    elif app_env == 'STG':
        # ステージング環境用の設定を行う
        print('ステージング')
    elif app_env == 'PRD':
        # 本番環境用の設定を行う
        print('本番')
    else:
        # ローカル環境用の設定を行う
        print('ローカル')

if __name__ == '__main__':
    main()

これで環境変数で自動で切り替わるため、手動による設定の手間や、モジュール配布時に設定が上書きされた、といった事故も減らせることができると思います。