在python中渲染并加载yaml文件

问题描述 投票:-1回答:3

我正在尝试以jinja2格式加载yaml文件并“评估”/“渲染”模板。这里,例子:

{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}

我想能够加载yaml文件并说yaml ['package'] ['version'] = 0.3.3

我必须尝试ruamel YAML,但它不评估版本只给我一个包。

这里的python代码:

yaml = YAML(typ='jinja2')
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(content)
print (yaml_content['package'])

python jinja2 pyyaml ruamel.yaml
3个回答
1
投票

使用传递给typ='jinja2''ruamel.yaml实例的YAML()参数加载YAML的jinja2模板是为了从模板中生成有效的YAML,因此您可以将模板修改为有效的YAML并将其写回。它不会执行任何模板渲染,也不会声明在文档中的任何位置执行此操作。

您需要做的是首先使用jinja2渲染模板,然后加载值(您可以使用快速yaml = YAML(typ='safe')选项)。

你可以,例如做类似的事情:

from jinja2 import Environment
from ruamel.yaml import YAML

yaml = YAML(typ='safe')
yaml_content = yaml.load(Environment().from_string(content).render())
print(yaml_content['package'])

0
投票

不确定ruamel.yaml,但你可以使用jinja2包和pyyaml包轻松地做你想要的:

from jinja2 import Environment, BaseLoader
import yaml

content = '''{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}'''

yaml_content = yaml.safe_load(Environment(loader=BaseLoader()).from_string(content).render())
print(yaml_content['package']['version'])

这输出:

0.3.3

0
投票

我不确定你有什么完整的例子,但这是我必须要做的。如果我得到正确的你想加载一个jinja文件然后通过ruamel.yaml包获取值

from ruamel.yaml import YAML
from jinja2 import Environment, FileSystemLoader

jinja = Environment(loader = FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True)
template = jinja.get_template('sample.yml')
yaml=YAML()
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(template.render())
print (yaml_content['package'])
#sample.yml
{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}

结果:

{'name': 'pyexcel-ezodf', 'version': '0.3.3'}

typ='jinja2'不支持使用ruamel,除非你有一些自定义设置,因为它给出了以下内容:

NotImplementedError: typ "jinja2"not recognised (need to install plug-in?)

© www.soinside.com 2019 - 2024. All rights reserved.