1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python の ConfigParser を利用した設定管理クラスのテンプレート

Last updated at Posted at 2024-10-29

概要

自分がよく使う Python のConfigParserを使用して設定ファイルを読み込むための基本的なクラスの実装を共有します。
設定ファイルは .ini ファイルで、指定されたパスから読み込めます。

自分の過去記事ですが、それらを応用しています。

前提条件

ディレクトリ構造

以下のディレクトリ構造を想定しています。
main.pyconfigフォルダを同じフォルダに配置しています。

MyProject/
├── myproject/
│   ├── config/
│   │   └─── settings.ini
│   ├── main.py
│   └── core/
│       ├── __init__.py
│       └─── config_loader.py

設定ファイルの例 (settings.ini)

[DEFAULT]
setting1 = value1
setting2 = value2

[section1]
key1 = value1
key2 = value2

Python コード

main.py

import os
import sys

# フォルダの親ディレクトリをパスに追加する
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from myproject.core.config_loader import ConfigLoader

# ConfigLoaderのインスタンスを作成
loader = ConfigLoader()
# 読み込んだ設定を格納する
settings = loader.settings

# 設定を利用する例
# DEFAULTセクションのsetting1の値を表示
print("Setting 1:", settings["DEFAULT"]["setting1"])

core/config_loader.py

import os
import sys
from configparser import ConfigParser


class ConfigLoader:
    """
    設定ファイルを読み込むためのクラス。
    インスタンス化時にconfig_pathで指定した設定ファイルをロードする。
    デフォルトの設定ファイルは "config/settings.ini""""

    def __init__(self, config_path: str = "config/settings.ini"):
        # 実行環境に基づく基準パスを取得する
        self.base_path = self.fetch_base_path()
        # 設定ファイルを読み込み、設定情報を保持する
        self.settings = self.load_settings(config_path)

    def fetch_base_path(self) -> str:
        """実行環境に応じた基準パスを取得する"""
        # アプリケーションがfrozen状態(PyInstallerなどでパッケージ化)かどうかを判定
        if getattr(sys, "frozen", False):
            # パッケージ化されている場合は実行ファイルのディレクトリを返す
            return os.path.dirname(sys.executable)
        else:
            # パッケージ化されていない場合は、スクリプトの親ディレクトリを返す
            return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    def load_settings(self, config_path: str) -> ConfigParser:
        """設定ファイルを読み込み、ConfigParserオブジェクトを返す"""
        # 設定ファイルのフルパスを作成
        full_config_path = os.path.join(self.base_path, config_path)
        # 設定ファイルが存在するか確認
        if os.path.exists(full_config_path):
            # 設定ファイルを読み込み、ConfigParserオブジェクトを返す
            parser = ConfigParser()
            parser.read(full_config_path, encoding="utf-8")
            return parser
        else:
            # 設定ファイルが存在しない場合、FileNotFoundErrorをスローする
            raise FileNotFoundError(f"設定ファイルが見つかりませんでした: {config_path}")

使用方法

  1. settings.ini を作成し、必要な設定を記述します
  2. main.py を実行し、ConfigLoaderをインスタンス化します
  3. settings変数を通じて設定値にアクセスできるようになります
    • 例: settings["DEFAULT"]["setting1"]のようにアクセスできます

注意点

  • 設定ファイルのパスが正しいことを確認してください。デフォルトではconfig/settings.iniが指定されています
  • 設定ファイルの形式は.iniファイルである必要があります
  • 設定ファイルが存在しない場合、FileNotFoundErrorが発生します。状況によって適切なエラーハンドリングを行ってください
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?