python - yaml 和 jinja2 阅读器

标签 python jinja2 pyyaml

我希望能够像使用 PyYAML 库一样在 python 中读取 YAML jinja 配置文件,但我收到错误:

{% set name = "abawaca" %}
{% set version = "1.00" %}

package:
   name: {{ name }}
   version: {{ version }}

source:
   fn: {{ name }}-{{ version }}.tar.gz
   url: https://github.com/CK7/abawaca/archive/v{{ version }}.tar.gz
   sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529

build:
   number: 0

requirements:
   build:
        - gcc   # [not osx]
        - llvm  # [osx]

最佳答案

您输入的 YAML 无效,因为您可以轻松检查,例如here 您应该首先扩展 {% %} 结构,然后处理 YAML,或者您应该将您的文件变成有效的 YAML。

这是选择 jinja2 的部分结果,其中宏序列 {% ... %} 以在 YAML 中具有特殊含义的字符 ({) 开头.

如果你需要改变YAML,重新写出来,你可以定义你自己的分隔符并选择它们,这样在YAML中就没有特殊意义了。

{% %} 你应该放在 YAML 注释 block 中,因为在顶层你有一个映射并且应该只有键值对。实现这一点的一种方法是将开始重新定义为 #% %#(您不一定必须更改结束,但我更喜欢对称性)。

然后在更新之后,通过一个处理文件的小脚本运行正确的 YAML,并将分隔符替换为 jinja2 可以理解的分隔符,或者调整环境,以更改 jinja2 使用的实际定义。

更正了data.yaml:

#% set name = "abawaca" %#
#% set version = "1.00" %#

package:
   name: <{ name }>
   version: 42

source:
   fn: <{ name }>-<{ version }>.tar.gz
   url: https://github.com/CK7/abawaca/archive/v<{ version }>.tar.gz
   sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529

build:
   number: 0

requirements:
   build:
      - gcc   # [not osx]
      - llvm  # [osx]

这可以通过以下方式处理:

import jinja2
from ruamel import yaml

yaml_file = 'data.yaml'
tmp_file = 'tmp.yaml'

data = yaml.round_trip_load(open(yaml_file))
data['package']['version'] = '<{ version }>'
with open(tmp_file, 'w') as fp:
    yaml.round_trip_dump(data, fp)

environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(searchpath='.'),
    trim_blocks=True,
    block_start_string='#%', block_end_string='%#',
    variable_start_string='<{', variable_end_string='}>')

    print(environment.get_template(tmp_file).render())

给予:

package:
  name: abawaca
  version: 1.00

source:
  fn: abawaca-1.00.tar.gz
  url: https://github.com/CK7/abawaca/archive/v1.00.tar.gz
  sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529

build:
  number: 0

requirements:
  build:
  - gcc       # [not osx]
  - llvm      # [osx]

请注意,您必须使用 `ruamel.yaml(免责声明:我是该包的作者),您无法使用 PyYAML 轻松完成此操作,因为它会丢弃阅读 YAML 文件时的注释。由于注释中的所有 jinja2 都出现在文件的开头,您可以通过这个特定示例解决这个问题,但通常情况并非如此。

关于python - yaml 和 jinja2 阅读器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42083616/

相关文章:

python - 如何将颜色图绑定(bind)到数组?

python - Amazon-ses -错误 : 554, b'Message rejected : Email address is not verified?

python - 将嵌套的数字和字符串列表导出到制表符分隔文件

python - 如何显示 Copyleft 符号?

django - 如何在 yaml 中 Django 转储数据嵌套模型

python - 无法让 PyYAML 对象正确表示

python - (伪)不使用模块和时钟在 Python 中生成随机数

Django:Django + django-registration + jinja 的 View 问题

ansible:使用变量指定目录路径

python - 解析 yaml 文件并获取字典