如何使用PyYAML从Bash查找YAML值

问题描述

我正在测试在RHEL7环境中使用PyYAML v3.12解析适度复杂的YAML配置文件内容的可行性,方法是向其提供密钥并获取密钥对值。该查询看起来像这样的@import '@angular/material/datepicker/_datepicker-theme.scss' ,并使其打印回python my_yaml_search.py key_to_search,例如:

所需的bash命令:value

所需的响应(仅值,不是键值):python search_yaml.py $servername

到目前为止,我已经创建了以下.py:

myServer14

config.yml:

import sys
import yaml
key = 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"

到目前为止,运行--- 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 $servernamelist index out of range不产生任何结果。 我是Python / PyYAML的新手,所以我认为我可能会错误地将变量传递给程序,并且sys可能不是我需要的Python库,但是我在如何正确执行此操作方面遇到了麻烦-任何输入都会节省我的理智。

解决方法

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

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-based yq。 您可以从GitHub版本中安装提供的静态编译的yq二进制文件,也可以从 commercial GetPageSpeed存储库中使用yum进行安装,以方便日后更新:

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

然后您可以简单地:

~# yq read config.yml server.servername
~# myServer14