在 python 中读取 YAML 配置文件并使用变量

Posted

技术标签:

【中文标题】在 python 中读取 YAML 配置文件并使用变量【英文标题】:Reading YAML config file in python and using variables 【发布时间】:2016-11-19 04:00:36 【问题描述】:

假设我有一个 yaml 配置文件,例如:

test1:
    minVolt: -1
    maxVolt: 1
test2:
    curr: 5
    volt: 5

我可以使用以下方法将文件读入 python:

import yaml

with open("config.yaml", "r") as f:
    config = yaml.load(f)

然后我可以使用

访问变量
config['test1']['minVolt']

风格方面,使用配置文件中的变量的最佳方式是什么?我将在多个模块中使用变量。如果我只是简单地访问如上所示的变量,如果某些东西被重命名,我将需要重命名变量的每个实例。

只是想知道在不同模块中使用配置文件中的变量的最佳或常见做法是什么。

【问题讨论】:

【参考方案1】:

你可以这样做:

class Test1Class:
    def __init__(self, raw):
        self.minVolt = raw['minVolt']
        self.maxVolt = raw['maxVolt']

class Test2Class:
    def __init__(self, raw):
        self.curr = raw['curr']
        self.volt = raw['volt']

class Config:
    def __init__(self, raw):
        self.test1 = Test1Class(raw['test1'])
        self.test2 = Test2Class(raw['test2'])

config = Config(yaml.safe_load("""
test1:
    minVolt: -1
    maxVolt: 1
test2:
    curr: 5
    volt: 5
"""))

然后通过以下方式访问您的值:

config.test1.minVolt

重命名 YAML 文件中的值时,只需在一处更改类即可。

注意: PyYaml 还允许您直接将 YAML 反序列化为自定义类。但是,要使其正常工作,您需要向 YAML 文件添加标签,以便 PyYaml 知道要反序列化到哪些类。我希望您不想让 YAML 输入变得更复杂。

【讨论】:

另一个问题,当使用 GUI 界面时。我有一个带有配置设置的选项卡,用户可以在其中编辑配置文件。我能够覆盖 yaml 配置文件,但是当访问另一个模块中的变量时(在变量更新后),该模块仍然使用原始值。只有在我退出 GUI 并重新启动程序后,它才会使用新值。为什么会这样,我该如何解决? 如果此答案解决了您的问题,请标记为这样。如果您还有其他问题,请创建一个新问题来显示您的代码并描述您的问题,而不是在此处发表评论。【参考方案2】:

见Munch、Load YAML as nested objects instead of dictionary in Python

import yaml
from munch import munchify
c = munchify(f)yaml.safe_load(…))
print(c.test1.minVolt)
# -1
# Or
f = open(…)
c = Munch.fromYAML(f)

【讨论】:

以上是关于在 python 中读取 YAML 配置文件并使用变量的主要内容,如果未能解决你的问题,请参考以下文章

python读取yaml配置文件

python 读取yaml文件

读取Python的Yaml配置文件

python之yaml文件读取

python之yaml文件读取

Python配置文件管理之ini和yaml文件读取