【Python】python-dotenvの使い方(環境変数をコードに直接書かない方法)

5 min

こんにちは。ナミレリです。今回は環境変数をプログラムから切り離して管理したり簡単に切り替えて使うことのできるpython-dotenvを紹介します。

この記事はこんな人にオススメ

  • パスワードやAPIキーなどの重要な情報をプログラム内に直接書きたくない
  • 開発環境と本番環境で環境変数を切り替えたい
この記事のMac環境
  • 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
Parallels Desktop 20 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 20 for Mac

Parallels Desktop 20 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

python-dotenvとは?

python-dotenvは、.envからキーと値のペアを読み取り、環境変数として設定できます。例えば、OpenAIのAPIキーが自分用と開発用と2つあったとします。環境変数OPENAI_API_KEYには自分用のAPIキーが設定されているとします。

例:例えばOpenAIのAPIキーの環境変数をpython-dotenvで使う
  1. OpenAIのAPIキーが自分用と開発用と2つある
  2. 普段、環境変数OPENAI_API_KEYには自分用のAPIキーが設定されている
  3. あるPythonプログラムを実行した際は、開発用のAPIキーを使いたい

このような場合に、python-dotenvは、.envから値を読み込んで環境変数に設定することができるので、プログラムを実行した時だけ、普段設定されている自分用のAPIキーを上書きし開発用のAPIキーにすることができます。便利ですね。

デフォルトでは同じ環境変数名の値は上書きしませんが、load_dotenv(override=True)で環境変数を上書きすることもできます。

上書きする以外にも、そのプログラムを実行した時だけ、新たな環境変数を設定することもできます。

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

特定のプロジェクト内でpython-dotenvを使用したい場合は、venv仮想環境にインストールすると良いです。下のようにします。

下の例では、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_KEYSTABILITY_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を使って環境変数を上書きする

デフォルトでは同じ環境変数名の値は上書きしませんが、load_dotenv(override=True)で環境変数を上書きすることもできます。

既に、環境変数OPENAI_API_KEYSTABILITY_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.getenvos.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'

上の通り存在しない環境変数を指定した場合は、os.getenvos.environ.getNoneを返しますが、os.environKeyErrorを返します。

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が公開されないようにすることがとても重要です。

テックアカデミーで学ぶPythonコース

\無料相談もできます/

テックアカデミーの特徴

現役エンジニアから学べるオンラインに特化したプログラミングスクール。
講師は全員、通過率10%の選考に合格した現役エンジニア
・確かなスキルをもとにマンツーマンサポート。
・900社、30,000名を超える教育実績

Pythonコースの概要

Pythonを学んで機械学習の基礎を習得。
1人では続かない方のためのパーソナルメンターがつく学習プログラム。
機械学習プログラムを開発することがゴール

こんな方にオススメ

・機械学習を学びエンジニアとして活躍したい方
・時間と場所にとらわれない働き方をしたい方
・将来の技術を学びたい学生の方
・機械学習を用いて起業したい方

機械学習の基礎を習得

画像を解析して分類(画像から犬か猫かを分類する)
データから花の種類を分類(データセットから花の種類を分類)
住宅価格の分析と予想(データセットから部屋数と住宅価格を予想)
ビットコインの価格変動を予測(ビットコインの過去のデータから価格変動を予想)

\無料相談もできます/

カテゴリー:
関連記事