Pythonでの.envファイルを用いた環境変数の管理と操作

アプリケーションの設定情報をソースコードから切り離し、異なる実行環境(開発、本番など)間で柔軟に切り替えるために、環境変数の利用は不可欠です。Pythonプロジェクトでは、.envという拡張子のテキストファイルを用いてこれらの設定を管理する手法が一般的です。本記事では、Pythonを使用して.envファイルを読み込み、および書き込む具体的な実装方法について解説します。

.envファイルの役割と構造

.envファイルは、キーと値のペアによって構成されるシンプルなテキストファイルです。通常、データベースの接続情報やAPIキーなどの機密情報、アプリケーションの挙動を制御するフラグなどを保存します。形式は非常に直感的であり、各行に「KEY=VALUE」の形式で記述します。

APP_ENV=production
DEBUG_MODE=false
REDIS_HOST=192.168.1.10
API_ENDPOINT=https://api.service.com/v1

環境変数の読み込み

Pythonで.envファイルを扱う際、デファクトスタンダードとなっているライブラリが「python-dotenv」です。これを使用すると、ファイル内の変数をosモジュールを通じてプログラムに容易に取り込めます。

まずはパッケージのインストールが必要です。

pip install python-dotenv

以下のコードは、.envファイルから設定を読み込み、アプリケーション内で利用する例です。今回は、ファイルのパスを明示的に指定し、型変換を含めた変数の取り出しを行っています。

import os
from pathlib import Path
from dotenv import load_dotenv

# プロジェクトのルートディレクトリにある.envファイルのパスを取得
env_file_path = Path(__file__).parent / '.env'

# .envファイルの内容を環境変数としてロード
load_dotenv(env_file_path)

# 環境変数の取得(文字列として取得した後、必要に応じて型変換)
environment = os.getenv('APP_ENV', 'development')
is_debug = os.getenv('DEBUG_MODE', 'False').lower() in ('true', '1', 't')
cache_address = os.getenv('REDIS_HOST')

print(f"実行環境: {environment}")
print(f"デバッグモード: {is_debug}")
print(f"キャッシュアドレス: {cache_address}")

.envファイルへの書き込み

設定値を永続化するために、プログラムから動的に.envファイルへ値を書き込む、あるいは追記する必要がある場合があります。Pythonの標準的なファイルI/O機能を使用して、キーと値のペアをファイルに書き込む処理を実装します。

以下の例では、新しい設定辞書を作成し、既存の.envファイルに追記する関数を定義しています。エンコーディングを指定することで、文字化けのリスクを回避しています。

def append_env_vars(filename, data_dict):
    """
    指定されたファイルに環境変数を追記する関数
    """
    try:
        with open(filename, mode='a', encoding='utf-8') as file_object:
            for key, value in data_dict.items():
                # キーは大文字に統一して書き込み
                file_object.write(f"{key.upper()}={value}\n")
        print(f"{len(data_dict)}件の設定を{filename}に追記しました。")
    except IOError as e:
        print(f"ファイル書き込みエラーが発生しました: {e}")

# 書き込みたい新しい設定データ
new_settings = {
    "service_token": "a1b2c3d4e5f6",
    "max_connections": "100"
}

append_env_vars('.env', new_settings)

タグ: Python python-dotenv os-module environment-variables file-io

6月24日 18:03 投稿