HOWTO · Python
Python で Env ファイルから環境変数を読み取る
python-dotenv を使って Python でローカルの .env 値を読み込む方法、またはスクリプトを開始する前にシェルから値を読み込んでエクスポートする方法を学びましょう。
このページの内容
.env ファイルには、サービスの URL や開発モードのフラグなどの設定値が格納されます。Python はそのファイルを自動的には読み込みません。アプリケーションでは、直接的な選択肢は python-dotenv です。Python プロセスを開始する前に値を読み込んでエクスポートしたい場合は、シェルスクリプトが便利です。
Python で python-dotenv を使って .env ファイルを読み取る
アプリケーションでは、実行に使用するのと同じ Python 環境に、python -m pip install python-dotenv で python-dotenv をインストールしてください。以下の例では、APP_MODE=development を含む一時的な .env ファイルを作成し、その正確なファイルパスを load_dotenv() に渡してから、os.getenv() で値を取得します。ご自身のアプリケーションでは、プロジェクトの .env ファイルのパスを load_dotenv() に渡してください。ファイルがスクリプトの隣にある場合は、Path(__file__).with_name(".env") を使用できます。
import os
from pathlib import Path
from tempfile import TemporaryDirectory
try:
from dotenv import load_dotenv
except ImportError:
print("Install python-dotenv to run this example.")
else:
with TemporaryDirectory() as directory:
env_path = Path(directory) / ".env"
env_path.write_text("APP_MODE=development\n", encoding="utf-8")
load_dotenv(env_path)
print(os.getenv("APP_MODE"))
実行時の証拠により、読み込みが成功したケースでは development が出力されたことが確認されています。提供された実行時の証拠には、依存関係が不足している場合のフォールバックも記録されており、“Install python-dotenv to run this example.” と出力されました。この例では、プロジェクトファイルではなく、コード内で作成された一時ファイルを読み込みます。デフォルトでは、load_dotenv() はプロセス環境に既に存在する APP_MODE の値を保持するため、development が出力されるのは、その変数がまだ設定されていない場合のみです。アプリケーションでは、上記のようにプロジェクトファイルのパスを明示的に渡してください。パッケージの使用方法の詳細については、python-dotenv ガイドを参照してください。
次の自己完結型の標準ライブラリの例は、インストール済みパッケージなしで単純な KEY=value ファイルを読み取るための別の代替手段です。
import os
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
env_path = Path(directory) / ".env"
env_path.write_text("APP_MODE=development\n", encoding="utf-8")
for line in env_path.read_text(encoding="utf-8").splitlines():
key, separator, value = line.partition("=")
if separator:
os.environ[key] = value
print(os.getenv("APP_MODE"))
development
この小さなパーサーは単純な KEY=value 行専用です。.env の解析動作が必要な場合は python-dotenv を使用してください。アプリケーションでは、ファイルがスクリプトの隣にある場合、dotenv_path=Path(__file__).with_name(".env") のようなパスを load_dotenv() に渡してください。シークレットはソース管理に含めず、認証情報を含むファイルへのアクセスを制限してください。
Python を実行する前に .env ファイルを読み込む
シェルでも値を読み込み、Python の子プロセスに渡すことができます。これは Python 仮想環境の有効化とは別です。ソース読み込み(sourcing)はシェルの変数を変更しますが、仮想環境は Python とインストール済みパッケージを選択します。
次の Bash の例では、独自のファイルを作成し、設定をソースとして読み込み、子プロセス用に値をエクスポートして、Python を実行します。
set -eu
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
cat > "$workdir/config.env" <<'ENV'
TYPE=prod
PORT=5000
ENV
cat > "$workdir/read_env.py" <<'PY'
import os
print(os.getenv("TYPE"))
print(os.getenv("PORT"))
PY
(
cd "$workdir"
set -a
. ./config.env
set +a
python3 read_env.py
)
prod
5000
ここで、set -a は代入をエクスポート対象としてマークし、.(Bash の source の POSIX 形式)はファイルを現在のシェルに読み込み、set +a は自動エクスポートを再びオフにします。ソース読み込みではシェル構文が実行されるため、信頼できるファイルのみを読み込んでください。python-dotenv 用の .env ファイルには、有効なシェル構文ではない構文が含まれている場合があります。シェルの設定はシンプルに保ち、使用するシェルと互換性のあるものにしてください。
値が見つからない場合は、パスが目的のファイルを指していること、キーの綴りが両方で一致していること、ファイルが Python の開始前に読み込まれることを確認してください。ファイルがスクリプトの隣にあるだけでは、その値がプロセス環境に入るわけではありません。
Windows でシェルスクリプトを実行する
Windows では、WSL または Git Bash を介して Bash ワークフローを実行してください。WSL は Ubuntu などの Linux ディストリビューションを提供します。Git Bash は Git のダウンロードページ から入手できます。WSL では、cd を使って run.sh を含むディレクトリに入ります。Git Bash では、そのディレクトリで Git Bash Here を選択するか、cd を使用します。次に ./run.sh を実行します。このスクリプトは一時ディレクトリに config.env と read_env.py を作成し、終了時にそれらを削除するため、それらのファイルを run.sh の隣に配置する必要はありません。
Bash が期待どおりに読み取れるよう、run.sh は Unix の改行コード(LF)で保存してください。
結論
Python アプリケーション内でローカルの .env ファイルを読み込むには python-dotenv を使用するか、Python を開始する前に Bash を使ってシェル互換の値をソースとして読み込み、エクスポートしてください。値が利用できない場合は、まずファイルパスと変数名を確認し、ソース読み込みではファイルがシェルコードとして実行されることを覚えておいてください。