【问题标题】:render and load yaml file in python在 python 中渲染和加载 yaml 文件
【发布时间】:2019-02-28 22:10:23
【问题描述】:

我正在尝试以 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代码吗?
  • @MostafaHussein 刚刚添加了代码。
  • 什么是content
  • 我相信您的输入文件可能有语法问题? jinja 可能需要被注释掉。考虑看看stackoverflow.com/questions/44422304/…
  • 一分钟内发布三个答案,任君挑选

标签: python jinja2 pyyaml ruamel.yaml


【解决方案1】:

我不确定您所拥有的完整示例是什么,但这是我让它发挥作用的方法。如果我正确理解了你想要加载一个 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'}

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

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

【讨论】:

    【解决方案2】:

    不确定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
    

    【讨论】:

    • 为什么要使用 PyYAML 的 load()?它被记录为可能不安全,根本不需要。
    • 当然,我已经按照当时的建议更新了答案。谢谢。
    【解决方案3】:

    为 YAML 加载 jinja2 模板,并将 typ='jinja2' 参数传递给 ruamel.yaml' YAML() 实例是为了从模板中生成有效的 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'])
    

    【讨论】:

      猜你喜欢
      • 2020-01-12
      • 2017-02-27
      • 2023-02-02
      • 2021-03-07
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多