ある程度の規模のシステムを開発する場合、アプリケーションはローカル、開発、ステージング、本番など複数の環境で動作することになります。同じ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()
これで環境変数で自動で切り替わるため、手動による設定の手間や、モジュール配布時に設定が上書きされた、といった事故も減らせることができると思います。