余談
社会人デビューから早1年、、何を学んだかな、、うーむ。
新入社員の子たちにすぐ追い越されそうで怯える毎日ですが(盛った)、そろそろコードにまつわる記事とかTipsを投稿したいなと思い、この記事を書いた次第です。
きっかけ
個人開発で.env
に格納された環境変数を取り出すだけでも、いちいちdotenv
モジュールimportしてこうやって、、って調べながら実装すると非常に面倒だなと感じました。
なので、たった数行のコードですが簡単に.env
を操作するための関数を実装したので紹介させてください!
本題
今回の実装は環境変数のロードとセットの2パターンで実装しました。
同階層のモジュールからの呼び出し
同階層に.env
と以下に示すenv.py
を配置し、さらにenv.py
を実行するmoduleA
モジュールも同階層であるパターン。
.
├── moduleA.py
├── env.py
└── .env
env.py
import os
import dotenv
def load_env(env_param_key: str) -> str:
"""Function to make getting a env param from .env file easier.
Args:
env_param_key (str): env param key name what you want to get.
Returns:
env_param_body (str): body of env param.
"""
dotenv_path = os.path.join(os.path.dirname(__file__), ".env")
dotenv.load_dotenv(dotenv_path)
env_param_body = os.environ.get(env_param_key)
return env_param_body
def set_env(env_param_key: str, env_param_body: str) -> None:
"""Function to make adding env param to .env file easier.
Args:
env_param_key (str): env param data what you want to set.
env_param_body (str): env param data what you want to set.
"""
f = dotenv.find_dotenv()
dotenv.set_key(f, env_param_key, env_param_body)
moduleA.py(env.pyを呼び出す)
import env
def main():
# 環境変数のセット
env.set_env("IAM", "IRONMAN")
# 環境変数のロード
result = env.load_env("IAM")
print(result)
if __name__ == "__main__":
main()
$ python moduleA.py
>> IRONMAN
ネストしたモジュールからの呼び出し
設計によっては以下のようにネストしたモジュールから使用したい場合もあるかと思います。
.
├── env.py
├── .env
└── dirA
└── dirB
└── moduleB.py
その場合は呼び出し元で少し工夫をしてあげる必要があります。具体的にはsys.path
にパスを追加する必要があります。
moduleB.py(env.pyを呼び出す)
import sys
sys.path.append("env.pyが存在するディレクトリの絶対パス")
import env
def main():
# 環境変数のセット
env.set_env("IAM", "BLACKPANTHER")
# 環境変数のロード
result = env.load_env("IAM")
print(result)
if __name__ == "__main__":
main()
$ python moduleB.py
>> BLACKPANTHER
まとめ
初めてコードにまつわる投稿をしたので緊張しますが、すこしでも勉強になった or 使えるかもとおもっていただけたら幸いです。ご指摘もいただけると幸いです!ここまで読んでいただき、ありがとうございました!!!