yaml 和 jinja2 reader
yaml and jinja2 reader
我希望能够像使用 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 注释块中,因为在 top-level 您有一个映射并且应该只有 key-value 对。实现这一点的一种方法是将开始重新定义为 #% %#
(您不一定必须更改结束,但我更喜欢对称性)。
然后在更新后,运行 通过处理文件的小脚本将正确的 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 都出现在文件的开头,您可以使用这个特定示例来解决这个问题,但通常情况并非如此。
我希望能够像使用 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 注释块中,因为在 top-level 您有一个映射并且应该只有 key-value 对。实现这一点的一种方法是将开始重新定义为 #% %#
(您不一定必须更改结束,但我更喜欢对称性)。
然后在更新后,运行 通过处理文件的小脚本将正确的 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 都出现在文件的开头,您可以使用这个特定示例来解决这个问题,但通常情况并非如此。