はじめに
Pythonでスクリプトを書いていると、APIキーやデータベースのパスワードなど、コードに直接書きたくない値が出てくる。そういった値を管理するのに便利なのが .env ファイルと python-dotenv ライブラリだ。
この記事では、.env ファイルの基本的な使い方を順を追って説明する。
なぜコードに直接書いてはいけないのか
たとえば、次のようなコードを書いたとする。
API_KEY = "sk-abc123xyz"
このままGitHubなどにpushすると、APIキーが世界中に公開されてしまう。悪意ある第三者に悪用されたり、クラウドサービスの利用料が発生したりするリスクがある。
設定値はコードの外に出しておくのが基本だ。
.envファイルとは
.env ファイルは、環境変数をテキスト形式で書いておくファイルだ。形式はシンプルで、キー=値 を1行ずつ並べるだけ。
API_KEY=sk-abc123xyz
DATABASE_URL=sqlite:///mydb.db
DEBUG=true
このファイルはGitの管理対象から外す(.gitignore に追加する)ことで、秘密の値をリポジトリに含めずに済む。
セットアップ
インストール
pip install python-dotenv
ファイル構成
myproject/
├── .env # 秘密の値を書くファイル(Gitに含めない)
├── .env.example # .envのサンプル(Gitに含める)
├── .gitignore
└── main.py
.env.example には実際の値を書かず、キー名だけ残しておくと、チームメンバーが何の値を用意すればいいか分かりやすい。
# .env.example
API_KEY=
DATABASE_URL=
DEBUG=
基本的な使い方
.envファイルを読み込む
from dotenv import load_dotenv
import os
load_dotenv() # .envファイルを読み込む
api_key = os.getenv("API_KEY")
print(api_key) # sk-abc123xyz
load_dotenv() を呼ぶと、.env に書いた値が環境変数としてセットされる。その後は os.getenv() で取得できる。
値が存在しない場合のデフォルト値
debug = os.getenv("DEBUG", "false") # 第2引数がデフォルト値
.env に DEBUG が書いていない場合は "false" が返る。
.gitignoreへの追加
.env ファイルは必ずGitの管理対象から外しておく。
# .gitignore
.env
これを忘れると、誤ってコミットしてしまう可能性がある。
よくあるミス
os.environ との違い
os.environ["KEY"] はキーが存在しないと KeyError が発生する。os.getenv("KEY") はキーが存在しない場合に None を返すため、エラーが起きにくい。用途に応じて使い分けよう。
# KeyErrorが発生する可能性がある
value = os.environ["API_KEY"]
# 存在しない場合はNoneが返る
value = os.getenv("API_KEY")
値は常に文字列になる
.env に DEBUG=true と書いても、Python側では文字列の "true" として扱われる。真偽値として使いたい場合は変換が必要だ。
debug = os.getenv("DEBUG", "false").lower() == "true"
load_dotenv() を呼ぶタイミング
load_dotenv() はスクリプトの先頭で呼ぶようにする。後から呼んだ場合、それより前の os.getenv() には反映されない。
まとめ
| やること | 方法 |
|---|---|
| インストール | pip install python-dotenv |
| .envに書く |
KEY=value 形式 |
| 読み込む | load_dotenv() |
| 値を取得する | os.getenv("KEY") |
| Gitから除外する |
.gitignore に .env を追加 |
.env ファイルを使う習慣をつけておくと、セキュリティ的に安全なコードが書けるようになる。小さなスクリプトであっても、APIキーなどを扱う場合は活用してみるのはどうでしょう。