概要
pythonでシステム環境変数を読み込む-その1を応用して、システム環境変数を取得するpythonプログラムを作成する。
構成
- EnvironWrapper.py・・・システム環境変数をカプセル化したpythonクラス
EnvironWrapper.py
import os
class EnvironWrapper:
"""
class:EnvironWrapper
概要:環境変数から読み込んだ起動パラメータを保持するクラス
"""
# 環境変数
defaultenv_context = {
"SECRET_KEY" : 'naishokey', # SECRET_KEY
"DEBUG_FLG" : 'true', # DEBUG_FLG
"ALLOWED_HOSTS" : None, # ALLOWED_HOSTS
}
# 環境変数
getenv_context = {}
def __init__(self):
"""
コンストラクタ
os.environから環境変数を読み取る
"""
for key, value in self.defaultenv_context.items():
param = os.getenv(key, default=value)
if key == "DEBUG_FLG" :
param = False if param.lower().startswith('false') else True
self.getenv_context[key] = param
def GetParams(self, key : str) -> object:
"""
GetParams:環境変数取得処理
Arguments:
key {str} -- 環境変数キー
Returns:
object -- 環境変数値
"""
return self.getenv_context[key]
if __name__ == "__main__":
env = EnvironWrapper()
for key, value in env.getenv_context.items():
print(f"key:{key}, value:{value}")
システム環境変数にはwindowsの%USERNAME%の様な永続化されたデータも含まれており、必要なシステム環境変数だけに限定したい。
defaultenv_context
で利用するシステム環境変数とそのデフォルト値を定義し、必要なシステム環境変数をgetenv_contextに辞書型で保持する。
os.environ
がそもそも辞書型なので、environのラッパークラスと命名している。
- EnvironWrapperRun.bat・・・Windows起動用
EnvironWrapperRun.bat
@ECHO OFF
ECHO <投入値>
REM 設定ファイルの読み込み
FOR /F "usebackq delims== tokens=1,2" %%i IN ("setting.ini") do (
SET %%i=%%j
SET %%i
)
ECHO:
ECHO <取得値>
python EnvironWrapper.py
- EnvironWrapperRun.sh・・・Linux起動用
EnvironWrapperRun.sh
#!/bin/bash
# 設定ファイルの読み込み
echo <投入値>
while read line
do
export $line
echo $line
done < setting.ini
echo <取得値>
python3 EnvironWrapper.py
- setting.ini・・・システム環境変数を定義した設定ファイル
setting.ini
SECRET_KEY=1234567890qwertyuiopasdfghjklzxcvbnm
DEBUG_FLG=True
ALLOWED_HOSTS=127.0.0.1
今回設定するシステム環境変数はOSに依存しないよう、setting.iniにまとめている。
システム環境変数の使用方法がOSに異なるため、起動用ファイルを分けている。
起動用ファイル内でsetting.iniを1行ずつ読み込んでシステム環境変数にセットしてからpythonプログラムを実行する。
- windowsでは
SET 変数名=変数値
、%変数値%
で参照可能 - Linuxでは
export 変数名=変数値
、$変数値
で参照可能、
次の課題
setting.iniの内容でわかる通り、Djangoのsetting.pyで使用する設定値を定義している。
setting.pyの設定値を開発状況(develop-staging-release)に合わせて、起動時にDIできるような仕組みを検討する。