如何将yaml文件路径传递给不同的模块并根据模块加载配置

How to pass yaml file path to different modules and load configuration based on module

我有一个 yaml 文件示例

logging:
   formatter:"abc" 
   handler:""
network:
   type:"udp"
udp:
   ip:"12.3.32.0"
   port:"20002"

当我启动 python 程序时,我正在使用 argparse 模块将 config.yaml 作为命令行参数传递,我正在尝试加载如下的 yaml 文件

main.py

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()

        with open(args.filepath, 'r') as yamlStream:
            try:
                self.config = yaml.safe_load(yamlStream)
            except yaml.YAMLError as exc:
                print(exc)

当我想准备登录时,我正在通过

logger.load_config(self.config["logging"])

logger.py

def load_config(self, config):
        self.config = config
        logging.config.dictConfig(self.config)

但我不想在启动 main 时一开始就加载,我只想传递文件路径,然后在需要时加载日志记录块、yaml 配置网络。

读取整个 YAML 文件并将整个结构传递给模块没有错。如果您只传递文件名,您将多次读取整个 YAML 文件,这实际上没有意义,除非您希望它在两次读取之间发生变化。

为了便于阅读,您可能需要定义一个 class 来保存配置,如下所示:

import argparse, yaml

class Config:
  def __init__(self, filepath):
    with open(filepath, 'r') as yamlStream:
      raw = yaml.safe_load(yamlStream)
    self.logging, self.network, self.udp = raw["logging"], raw["network"], raw["udp"]

parser = argparse.ArgumentParser(description='my yaml script')
parser.add_argument('-f','--filepath', help='yaml file path')
args = parser.parse_args()
config = Config(args.filepath)

初始化记录器看起来像

# called with the Config object, i.e. logger.load_config(config)
def load_config(self, config):
  # do you really need to store this?
  self.config = config
  # access the relevant section
  logging.config.dictConfig(config.logging)

通过传递主配置对象,您可以轻松访问评论中描述的其他部分。