如何将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




