有人能告诉我在脚本运行时更改配置文件中的参数的最佳方法是什么吗?..我需要能够在脚本运行时更改这些参数...
如果您使用通常的方式使用 .ini、yaml、toml 等文件,则配置会在第一次执行脚本时加载,如果您在脚本已经运行时更改这些参数,则这些参数会执行没有“加载”
您可以编写一个配置解析器来从 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')
,然后在各处导入实例。