ある程度の規模のシステムを開発する場合、アプリケーションはローカル、開発、ステージング、本番など複数の環境で動作することになります。同じlinux環境でもDBの接続先やメールの宛先は環境ごとに変える必要が出てくると思いますが、そんなとき環境変数を利用することが多いのではないでしょうか。このページでは環境変数を取得し、環境ごとに設定を切り替える方法について紹介します。
Contents
環境変数を取得する
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()
これで環境変数で自動で切り替わるため、手動による設定の手間や、モジュール配布時に設定が上書きされた、といった事故も減らせることができると思います。
