为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 PyYAML 从 Bash 查找 YAML 值

如何使用 PyYAML 从 Bash 查找 YAML 值

喵喔喔 2023-10-18 15:50:50
我正在测试在 RHEL7 环境中使用 PyYAML v3.12 来解析中等复杂的 YAML 配置文件内容的可行性,方法是向其提供密钥并获取密钥对值。该查询看起来像这样python my_yaml_search.py key_to_search并打印回value,例如:所需的 bash 命令:python search_yaml.py $servername所需的响应(仅值,而不是键值):myServer14到目前为止,我已经创建了以下 .py:import sysimport yamlkey = sys.argv[1]with open("config.yml") as f:    try:        data = yaml.safe_load(f)        for k, v in data.items():            if data[k].has_key(key):                print data[k][v]        except yaml.YAMLError as exc:        print "Error: key not found in YAML"配置.yml:---server:    servername: myServer14    filename: testfile.zip    location: http://test-location/1.com    repo:        server_name_fqdn: server.name.fqdn.com        port: 1234到目前为止,运行python search_yaml.py $servername会产生list index out of range; python search_yaml.py servername什么也不产生。我是 Python/PyYAML 的新手,所以我认为我可能错误地向程序传递了一个变量,并且 sys 可能不是我需要的 Python 库,但是我在如何正确执行此操作方面遇到了障碍 -任何输入都会挽救我的理智。
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

如果您知道要遍历的所有键,则可以执行以下操作:


import sys

import yaml


key = sys.argv[1]


with open("config.yml") as f:

    data = yaml.safe_load(f)

    n = key.count('.')

    parts = key.split('.')

    res = None

    i = 0

    while i <= n:

        try:

            if not res:

                res = data[parts[i]]

            else:

                res = res[parts[i]]

        except (yaml.YAMLError, KeyError) as exc:

            print ("Error: key not found in YAML")

            res = None

        i = i + 1

    if res:

        print(res)

测试

~# python search_yaml.py server.repo.port

~# 1234


~# python search_yaml.py server.servername

~# myServer14

这可能有错误,我编写代码只是为了看看是否可以在没有第三方工具的情况下轻松完成。


适用于 YAML 的 CLI 应用程序

浏览本次作品的您可能还对程序感兴趣yq。实际上有两个同名的程序,一个是用 Go 实现的,另一个是基于 Python 的(可能比上面的代码更复杂):-)


基于Go的yq. yq您可以从 GitHub 版本安装提供的静态编译的二进制文件,也可以yum使用商业GetPageSpeed 存储库进行安装,以便以后轻松更新:


sudo yum -y install https://extras.getpagespeed.com/release-latest.rpm

sudo yum -y install yq

然后你可以简单地:


~# yq read config.yml server.servername

~# myServer14


查看完整回答
反对 回复 2023-10-18
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信