渲染文件中的变量 - python

有一个api.yml文件,其中包含用于ansible的配置:

config/application.properties:
 server.port: 6081
 system.default.lang: rus
 api.pdd.url: "http://{{ stage['PDD'] }}"
 api.policy.alias: "integration"
 api.order.url: "http://{{ stage['Order'] }}
 api.foo.url: "http://{{ stage['FOO'] }}

有一个stage.yml,其中包含键和阶段值:

default_node:
 Order: '172.16.100.40:8811'
 PDD: '172.16.100.41:8090'
 FOO: '10.100.0.11:3165

实际上,这些文件更大,并且“ stage”变量也很多。
我的任务是解析api.yml并将其转换为properties-config。问题是我无法提取值{{stage ['value']}}我正试图通过这种方式做到这一点:

stream = yaml.load(open('api.yml'))
result={}
result.update(stream['config/application.properties'])
context= yaml.load(open('stage.yml'))
stage={}
stage.update(context['default_node'])
text = '{% for items in result | dictsort(true)%}  {{ items[0] }} = {{
     items[1] }} {%endfor%}'

template = Template(text)
properti = (template.render(result=result, stage=stage))

在输出中我得到这个:

server.port = 6081
system.default.lang = rus
api.pdd.url = http://{{ stage['PDD'] }}
api.policy.alias = integration
api.order.url = http://{{ stage['Order'] }}
api.foo.url = http://{{ stage['FOO'] }}

并且您需要获得此:

server.port = 6081
system.default.lang = rus
api.pdd.url = 172.16.100.41:8090
api.policy.alias = "integration"
api.order.url = 172.16.100.40:8811
api.foo.url = 10.100.0.11:3165

我可以用jinja或ansible lib做吗?
对不起,我的英语不好

参考方案

按照这种方法,您需要将api.yml当作模板本身并进行渲染。否则,jinja2会将其视为属性的简单值。这样的事情会做:

import yaml
from jinja2 import Environment, Template 
import json  


stream = yaml.load(open('api.yml'))
result={}
result.update(stream['config/application.properties'])
context= yaml.load(open('stage.yml'))
stage={}
stage.update(context['default_node'])
text = """{% for items in result | dictsort(true)%}  {{ items[0] }} = {{ items[1] }} {%endfor%}"""

#Then render the results dic as well
resultsTemplate = Template(json.dumps(result))
resultsRendered = json.loads( resultsTemplate.render(stage=stage) )

template = Template(text) 
properti = (template.render(result=resultsRendered, stage=stage))

之后,您将在properti变量中看到所需的值:

'  api.foo.url = http://10.100.0.11:3165   api.order.url = http://172.16.100.40:8811   api.pdd.url = http://172.16.100.41:8090   api.policy.alias = integration   server.port = 6081   system.default.lang = rus'

如果jinja2能够递归渲染,那就太好了。也许可以花一些时间与Environment的全局变量和共享模式进行锻炼,这可以实现。

希望这可以帮助。

通过Python使用FacePlusPlus API - python

我收到以下错误。'error_message': 'BAD_ARGUMENTS 当我执行此python代码时。import requests import json response = requests.post( 'https://api-us.faceplusplus.com/facepp/v3/detect&#…

Python-使用请求时发布请求失败 - python

使用外壳程序时,我可以通过运行以下命令成功创建新用户curl --user administrator:pasword "Content-Type: application/json" https://localhost:8080/midpoint/ws/rest/users -d @user.json但是,当我尝试使用请求在python…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。