まくまくPythonノート
.env ファイルで環境変数を設定する (python-dotenv)
2020-05-27

python-dotenv モジュールの概要

python-dotenv モジュール を使用すると、Python プログラム実行時に下記のようなファイルを読み込んで、環境変数を設定することができます。

.env

MYAPP_USER=maku
MYAPP_PASS=makupass
MYAPP_CONFIG=${HOME}/${MYAPP_USER}/config

上記の例のように、${HOME} という形で環境変数の値を展開することもできます。

特定のプログラムを実行するために、いちいち OS の環境変数を設定するのを嫌がるユーザーはたくさんいます。 あなたのプログラムが何らかの環境変数を必要としているのであれば、.env ファイルによる設定手段も提供しておくと親切です。

.env の仕組みは Python に限ったものではなく、いろいろな言語で採用されています。

python-dotenv モジュールのインストール

python-dotenv モジュールは pip コマンドでインストールできます。

$ pip install python-dotenv

システム全体の Python 実行環境を汚したくない場合は、次のように 仮想環境を作成してインストール しましょう。

$ python -m venv ~/venv
$ source ~/venv/bin/activate
(venv) $ pip install python-dotenv

仮想環境は次のように抜けられます。

(venv) $ deactivate

python-dotenv の使い方

.env ファイルの内容を環境変数に反映する

.env ファイルを読み込むのはとても簡単で、load_dotenv() を呼び出すだけです。 次の Python スクリプトでは、同じディレクトリ(あるいは、より上位のディレクトリ)に置かれた .env ファイルの内容を読み込み、環境変数に反映しています。

config.py

# .env ファイルをロードして環境変数へ反映
from dotenv import load_dotenv
load_dotenv()

# 環境変数を参照
import os
MYAPP_USER = os.getenv('MYAPP_USER')
MYAPP_PASS = os.getenv('MYAPP_PASS')

仮に、.env ファイルが存在しなくても、load_dotenv() はエラーにならないので、上記のようなコードは安心して実行することができます。 ちなみに、上記の config.py モジュールは、次のような感じで使用します。

main.py

import config

print(config.MYAPP_USER)
print(config.MYAPP_PASS)

環境変数の値を上書きする

OS の環境変数設定で、すでに同じ名前の変数が定義されている場合は、そちらが優先して使われるようになっています。 .env ファイルで設定した値を優先して使いたい場合は、次のように override オプションを指定します。

from dotenv import load_dotenv
load_dotenv(override=True)

.env ファイルの扱い方

.env ファイルはどこに置くべきか?

ある Python スクリプトから dotenv.load_dotenv() 関数を呼び出すと、そのスクリプトファイルがあるディレクトリを起点に、.env ファイルが見つかるまで親ディレクトリを遡りながら検索します。 なので、あるプロジェクトで使用する .env ファイルは、そのプロジェクトのルートディレクトリに配置 しておけば、まずロードに失敗することはありません。

.env ファイルは Git にコミットする?

.env ファイルは、ユーザー固有の設定を記述するものです。 例えば、Web サービスのアクセストークンなどを記述するので、 .env ファイルは Git にコミットしてはいけません。 間違えてコミットしないように、.gitignore ファイルに .env のエントリを登録しておきましょう。

2020-05-27