如何使用python脚本替换要解析的yaml文件中的环境变量值
作者:互联网
我需要在yaml文件中使用环境变量“PATH”,需要用脚本解析.
这是我在终端上设置的环境变量:
$echo $PATH
/Users/abc/Downloads/tbwork
这是我的sample.yml:
---
Top: ${PATH}/my.txt
Vars:
- a
- b
当我用我的脚本解析这个yaml文件时,我没有看到PATH变量的实际值.
这是我的脚本:
import yaml
import os
import sys
stream = open("sample.yml", "r")
docs = yaml.load_all(stream)
for doc in docs:
for k,v in doc.items():
print k, "->", v
print "\n",
输出:
Top -> ${PATH}/my.txt
Vars -> ['a', 'b']
预期产出是:
Top -> /Users/abc/Downloads/tbwork/my.txt
Vars -> ['a', 'b']
如果我做错了,有人可以帮我弄清楚正确的方法吗?
解决方法:
默认情况下,PY-yaml库不解析环境变量.您需要定义一个隐式解析器,它将找到定义环境变量的正则表达式并执行一个函数来解决它.
你可以通过yaml.add_implicit_resolver和yaml.add_constructor来完成.在下面的代码中,您将定义一个解析器,该解析器将匹配YAML值中的${env variable}并调用函数path_constructor来查找环境变量.
import yaml
import re
import os
path_matcher = re.compile(r'\$\{([^}^{]+)\}')
def path_constructor(loader, node):
''' Extract the matched value, expand env variable, and replace the match '''
value = node.value
match = path_matcher.match(value)
env_var = match.group()[2:-1]
return os.environ.get(env_var) + value[match.end():]
yaml.add_implicit_resolver('!path', path_matcher)
yaml.add_constructor('!path', path_constructor)
data = """
env: ${VAR}/file.txt
other: file.txt
"""
if __name__ == '__main__':
p = yaml.safe_load(data)
print(os.environ.get('VAR')) ## /home/abc
print(p['env']) ## /home/abc/file.txt
标签:python,python-2-7,pyyaml 来源: https://codeday.me/bug/20190622/1261839.html