こんにちは。ナミレリです。今回は環境変数をプログラムから切り離して管理したり簡単に切り替えて使うことのできるpython-dotenvを紹介します。
この記事はこんな人にオススメ
- パスワードやAPIキーなどの重要な情報をプログラム内に直接書きたくない
- 開発環境と本番環境で環境変数を切り替えたい
- M2 MacBook Air 13.6 インチ
- M1 Max MacBook Pro 14インチ
- macOS Ventura 13.4.1(c)
- Python 3.10.9
- python-dotenv 1.0.0
目次
python-dotenvとは?
python-dotenvは、.envからキーと値のペアを読み取り、環境変数として設定できます。例えば、OpenAIのAPIキーが自分用と開発用と2つあったとします。環境変数OPENAI_API_KEYには自分用のAPIキーが設定されているとします。
- OpenAIのAPIキーが自分用と開発用と2つある
- 普段、環境変数OPENAI_API_KEYには自分用のAPIキーが設定されている
- あるPythonプログラムを実行した際は、開発用のAPIキーを使いたい
このような場合に、python-dotenvは、.envから値を読み込んで環境変数に設定することができるので、プログラムを実行した時だけ、普段設定されている自分用のAPIキーを上書きし開発用のAPIキーにすることができます。便利ですね。
上書きする以外にも、そのプログラムを実行した時だけ、新たな環境変数を設定することもできます。
python-dotenvをどんな時に使う?
上のOpenAIのAPIキーの例でもお伝えした通り、パスワードやAPIキーをプログラムから使う場合はpython-dotenvでプログラムから切り離して管理する時に一番使うと思います。他にも例えば、プログラムがデータベースにアクセスする際の接続情報(ホスト名、ユーザー名、パスワード等)もプログラムから切り離してpython-dotenvで管理します。また、APIのエンドポイントが開発環境と本番環境で異なる場合にも簡単に切り替えることができるのでおすすめです。
python-dotenvを使う最大のメリット
上述のようにpython-dotenvを使うと、Pythonプログラムが実行されるときに自動的に.envファイルから環境変数を読み込むので、パスワードやAPIキーなどの重要な情報をコードに直接書かずに安全に管理することができることが最大のメリットかと思います。
python-dotenvのインストール
python-dotenvを使用するためには、pipを使用して簡単にインストールすることができます。以下のコマンドを実行します。
pipでインストール
pip install python-dotenv
下の例では、myenvという仮想環境を作成し、プロジェクト毎に依存関係を独立してpipライブラリを管理することができます。
venv仮想環境内にインストール
mkdir ~/test_env
cd ~/test_env
python -m venv myenv
source myenv/bin/activate
pip install python-dotenv
python-dotenvの使い方
まず、.envという名前のファイルに環境変数を保存します。それをpython-dotenvを使い簡単にPythonプログラムから読み込むことができます。やってみましょう。
.envの準備
上で作成した~/test_envに.envを作ってみましょう。.envに記載する環境変数はOPENAI_API_KEYとSTABILITY_API_KEYの2つにしてみます。
pwd
~/test_env
vi .env
# 環境変数を設定
OPENAI_API_KEY=aaaaaaaaaaaaaaaaaa
STABILITY_API_KEY=bbbbbbbbbbbbbbb
python-dotenvを使って環境変数を読み込む
次に、python-dotenvを使って.envに書いた環境変数を読み込みます。以下がサンプルコードです。
from dotenv import load_dotenv
import os
# .envファイルをロードします
load_dotenv()
# 環境変数を取得します
openai_api_key = os.getenv("OPENAI_API_KEY")
stability_api_key = os.getenv("STABILITY_API_KEY")
# 環境変数を出力
print(f"openai.api_key: {openai_api_key}")
print(f"stability.api_key: {stability_api_key}")
python-dotenvを使って環境変数を上書きする
既に、環境変数OPENAI_API_KEYとSTABILITY_API_KEYが設定されている場合に上書きしたい場合は、下のサンプルのようにload_dotenv(override=True)で.envをロードすると環境変数を上書きすることができます。
from dotenv import load_dotenv
import os
# .envファイルをロードします。
# 同じ環境変数名が既に設定されている場合は、値を上書きする
load_dotenv(override=True)
# 環境変数を取得します
openai_api_key = os.getenv("OPENAI_API_KEY")
stability_api_key = os.getenv("STABILITY_API_KEY")
# 環境変数を出力
print(f"openai.api_key: {openai_api_key}")
print(f"stability.api_key: {stability_api_key}")
上のサンプルコードでは、os.getenvを使って環境変数を取得していますが、os.environ.getでも取得できます。
os.getenvとos.environの違い
これまでのサンプルコードでは、os.getenvを使って環境変数を取得していますが、os.environでも取得できます。少し使い方などに違いがありますので紹介します。
ざっくり、os.getenvとos.environの使い方は下の3つがあります。
os.getenv('OPENAI_API_KEY')
os.environ.get('OPENAI_API_KEY')
os.environ['OPENAI_API_KEY']
os.getenv('OPENAI_API_KEY')
from dotenv import load_dotenv
import os
load_dotenv()
# 環境変数を取得します
key = os.getenv('OPENAI_API_KEY')
# 環境変数を出力
print(f"key: {key}")
os.environ.get('OPENAI_API_KEY')
from dotenv import load_dotenv
import os
load_dotenv()
# 環境変数を取得します
key = os.environ.get('OPENAI_API_KEY')
# 環境変数を出力
print(f"key: {key}")
os.environ['OPENAI_API_KEY']
from dotenv import load_dotenv
import os
load_dotenv()
# 環境変数を取得します
key = os.environ['OPENAI_API_KEY']
# 環境変数を出力
print(f"key: {key}")
存在しない環境変数を指定した場合の違い
存在しない環境変数を読み込む場合は、どうなるでしょうか。NO_KEYという存在しない環境変数を読んでそれぞれで試してみます。
os.getenv('NON_KEY')
python ./test1.py
key: None
os.environ.get('NON_KEY')
python ./test2.py
key: None
os.environ['NON_KEY']
python ./test2.py
Traceback (most recent call last):
File "/Users/user/test_env/test3.py", line 7, in
key = os.environ['NON_KEY']
File "/Users/user/.pyenv/versions/miniforge3-22.11.1-4/lib/python3.10/os.py", line 680, in __getitem__
raise KeyError(key) from None
KeyError: 'NO_KEY'
python-dotenv使い方(応用編)
知っておくと便利な使い方を紹介します。
デフォルト値の設定
os.getenvは先程の様に、存在しない環境変数を指定した場合にNoneを返しますが、第二引数に値を指定することで環境変数が設定されていない場合のデフォルト値を設定することができます。
第二引数でデフォルト値を設定
value = os.getenv("NON_KEY", "default-value")
.envのパスを指定
load_dotenv関数に引数を指定しない場合、この関数は現在のディレクトリまたは親ディレクトリを検索し、.envファイルを探します。また、load_dotenvに.envのパスを引数として指定することもできます。
load_dotenv('/path/to/.env')
最後に
最後まで読んでいただきありがとうございます。.envは、パスワードやAPIキーなどの重要な情報を書くことも多いため、Gitに上げるのは避ける必要があります。.gitignoreを使用して、.envが公開されないようにすることがとても重要です。
\無料相談もできます/
・現役エンジニアから学べるオンラインに特化したプログラミングスクール。
・講師は全員、通過率10%の選考に合格した現役エンジニア。
・確かなスキルをもとにマンツーマンサポート。
・900社、30,000名を超える教育実績
Pythonを学んで機械学習の基礎を習得。
1人では続かない方のためのパーソナルメンターがつく学習プログラム。
機械学習プログラムを開発することがゴール。
・機械学習を学びエンジニアとして活躍したい方
・時間と場所にとらわれない働き方をしたい方
・将来の技術を学びたい学生の方
・機械学習を用いて起業したい方
・画像を解析して分類(画像から犬か猫かを分類する)
・データから花の種類を分類(データセットから花の種類を分類)
・住宅価格の分析と予想(データセットから部屋数と住宅価格を予想)
・ビットコインの価格変動を予測(ビットコインの過去のデータから価格変動を予想)
\無料相談もできます/