首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >yaml和jinja2阅读器

yaml和jinja2阅读器
EN

Stack Overflow用户
提问于 2017-02-07 14:59:13
回答 1查看 2.3K关注 0票数 3

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

代码语言:javascript
运行
复制
{% 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]
EN

Stack Overflow用户

回答已采纳

发布于 2017-02-07 15:20:51

您的输入是无效的YAML,因为您可以很容易地检查,例如here您应该首先展开{% %}构造,然后处理YAML,或者您应该使您的文件成为有效的YAML。

这在一定程度上是因为选择了jinja2,对于这种情况,宏序列{% ... %}以在YAML中具有特殊含义的字符({)开头。

如果您需要更改YAML,并将其重新写出,您可以定义自己的分隔符,并选择它们,使其在YAML中没有特殊含义。

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

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

已更正的data.yaml

代码语言:javascript
运行
复制
#% 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]

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

代码语言:javascript
运行
复制
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())

给予:

代码语言:javascript
运行
复制
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都出现在文件的开头,所以您可以在这个特定的示例中解决这个问题,但通常情况并非如此。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42083616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档