Python - 如何使用配置文件在运行时更改参数

问题描述 投票:0回答:1

有人能告诉我在脚本运行时更改配置文件中的参数的最佳方法是什么吗?..我需要能够在脚本运行时更改这些参数...

如果您使用通常的方式使用 .ini、yaml、toml 等文件,则配置会在第一次执行脚本时加载,如果您在脚本已经运行时更改这些参数,则这些参数会执行没有“加载”

python configuration config
1个回答
0
投票

您可以编写一个配置解析器来从 yaml、toml 等加载配置,并将其作为单例对象存储在内存中,并向其中添加一个方便的方法来重新加载值。 然后,在任何函数中,每当您想要新值可用时,只需调用 reload 方法即可。

这是一个例子

configurator.py

# Filename: configurator.py

import typing as t

import os
import yaml
from yaml.parser import ParserError


class ConfigError(Exception):
    """A Configuration error"""
    pass


class Configurator:
    """A simple configuration loader class"""

    def __init__(self, cfg_file_path):
        self.cfg = self.load_yaml_config(cfg_file_path)
        self.cfg_file_path = cfg_file_path

    def reload(self):
        """Reloads configuration from existing config file"""
        del self.cfg
        self.cfg = self.load_yaml_config(self.cfg_file_path)

    def load_yaml_config(self, cfg: t.Optional[str] = None):
        """Loads configuration from a yaml file

        Args:
            cfg: Path to config file
        """

        # If no cfg file is provided then proceed to load
        # from environment variable.
        if not cfg:
            cfg = os.getenv("CONFIG_FILE")

        if not cfg:
            raise ConfigError("CONFIG_FILE env is not set")

        # Test if an absolute path has been given
        if not os.path.exists(cfg):
            raise ConfigError("Couldn't load config file")

        # Load config
        with open(cfg, "r") as f:
            try:
                config = yaml.safe_load(f)
            except ParserError as err:
                raise ConfigError(f"Couldn't load configuration - {err}")

        return config

然后使用它如下:

# Filename: hello.py

from configurator import Configurator

def hello():
    config = Configurator('default_cfg.yaml')

    print(config.cfg.get('name', 'John'))

    # Now go ahead and change the name in the yaml file
    config.reload()

    # print(config.cfg.get('name', 'Jane'))

您可以在全局级别声明

config = Configurator('default_cfg.yaml')
,然后在各处导入实例。

© www.soinside.com 2019 - 2024. All rights reserved.