问题描述
我正在测试在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 $servername
; list 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