我的配置文件格式为json
,格式为yaml
。我希望能够使用作为环境变量的值读取这些配置文件。例如:
{"username":"Dan", "password":"<%= ENV['DB_PASSWORD']%>"}
这意味着从环境变量加载json文件时检索密码,并用具体值替换<%= ENV['DB_PASSWORD']%>
。
注意:1。上面提到的语法就像使用ruby的erb一样仅用于说明 2.我更喜欢原生python的解决方案而不安装新的python包,但如果没有,我也会接受这个。
答案 0 :(得分:4)
您所寻找的通常称为模板,您基本上已经定义了模板语言。
根据您想要做的完全,您可以使用stdlib中的string.Template
库。它只做简单的变量替换,而不是ERb,它允许任意代码(包括删除所有数据的代码,格式化硬盘,启动后门,......)。
因此,string.Template
比ERb更强大,但 更安全。您的示例已经证明了这一点,因为您甚至无法从模板中访问环境变量,您必须明确地传递它们。
这是基本用法:
from string import Template
s = Template('{"username": "Dan", "password": "$db_password"}')
s.safe_substitute(db_password = 's00persekrit')
# >>> {"username": "Dan", "password": "s00persekrit"}
由于在模板中无法访问环境变量,因此您必须明确地将它们传递给模板:
from string import Template
from os import environ as env
s = Template('{"username": "Dan", "password": "$db_password"}')
s.safe_substitute(db_password = env['DB_PASSWORD'])
# >>> {"username": "Dan", "password": "s00persekrit"}
实际上,如果您想让模板访问所有环境变量,您应该能够直接传递os.environ
dict(您可以传递任何dict
- 类似的对象进行映射)。
from string import Template
from os import environ as env
s = Template('{"username": "Dan", "password": "$DB_PASSWORD"}')
s.safe_substitute(env)
# >>> {"username": "Dan", "password": "s00persekrit"}
如果你想要一些更强大的替换,那么你应该看一些其他所谓的“无逻辑”模板语言(即只执行简单替换但不允许执行代码的语言,并且不允许条件或循环)。其中一种语言是Mustache(GitHub使用的模板语言),有许多语言的实现,包括Pystache for Python。
如果您需要/需要更多高级功能,例如循环,条件等,您可能需要查找功能更全面的template languages,例如Jinja。