You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将YAML文件路径传递给不同模块并按需加载配置

我懂你想要的效果了——不想在程序刚启动就把整个YAML配置一股脑加载完,而是只传个文件路径,等用到logging或者network这些配置块的时候再去读取对应的部分对吧?这就给你安排具体的实现方案:

解决方案

1. 修改main.py:只保存配置文件路径,不提前加载全量YAML

原来的load_config方法里,我们不再解析整个YAML内容,只把用户传入的文件路径存下来,留到需要的时候再用:

def load_config(self):
    parser = argparse.ArgumentParser(description='my yaml script')
    parser.add_argument('-f','--filepath', help='yaml file path')
    self.args = parser.parse_args()
    # 只保存文件路径,暂不加载配置内容
    self.config_file_path = self.args.filepath

2. 写个通用的配置块加载工具(推荐复用)

可以单独写个工具函数,专门用来根据文件路径和配置块名称,加载对应的部分。这样各个模块都能复用这个逻辑,不用重复写文件读取的代码:

# 比如放在utils.py中
import yaml

def load_config_block(file_path, block_name):
    """从指定YAML文件加载指定名称的配置块"""
    with open(file_path, 'r') as yamlStream:
        try:
            full_config = yaml.safe_load(yamlStream)
            # 返回指定块,不存在则返回空字典避免报错
            return full_config.get(block_name, {})
        except yaml.YAMLError as exc:
            print(f"加载配置块[{block_name}]失败: {exc}")
            return {}

3. 调整logger.py:按需加载logging配置块

现在把logger的load_config改成接收文件路径,然后通过工具函数加载对应的logging块:

from utils import load_config_block
import logging

def load_config(self, config_file_path):
    # 加载logging配置块
    logging_config = load_config_block(config_file_path, "logging")
    logging.config.dictConfig(logging_config)

之后在main里调用logger的配置方法时,直接传保存好的文件路径就行:

logger.load_config(self.config_file_path)

如果不想单独写工具函数,也可以直接在logger里实现加载逻辑:

import yaml
import logging

def load_config(self, config_file_path):
    with open(config_file_path, 'r') as yamlStream:
        try:
            full_config = yaml.safe_load(yamlStream)
            logging_config = full_config.get("logging", {})
            logging.config.dictConfig(logging_config)
        except yaml.YAMLError as exc:
            print(f"加载日志配置失败: {exc}")

4. 同理处理network配置块

当需要用到网络配置时,用同样的逻辑加载network块即可:
比如在network相关的模块里:

from utils import load_config_block

def init_network(config_file_path):
    network_config = load_config_block(config_file_path, "network")
    # 这里写初始化网络的逻辑,比如读取ip、port
    udp_config = network_config.get("udp", {})
    ip = udp_config.get("ip")
    port = udp_config.get("port")
    # ...后续操作

然后在main里需要初始化网络的时候调用:

init_network(self.config_file_path)

这样就完全实现了按需加载的需求——只有当某个模块需要用到对应的配置块时,才会去读取YAML文件并加载该部分内容,而不是程序启动时就把整个配置都加载到内存里。

内容的提问来源于stack exchange,提问作者Sara

火山引擎 最新活动