Ваш вход не действует YAML, как вы можно легко проверить, например here Вы должны сначала развернуть конструкции {% %}
, а затем обработать YAML, или вы должны сделать свой файл в действительном YAML.
Это частично связано с выбором jinja2, для которого макрокоманды {% ... %}
начинаются с символа ({
), который имеет особое значение в YAML.
Если вам нужно изменить YAML и записать его снова, вы можете определить свои собственные разделители и выбрать их так, чтобы в YAML не было особого значения.
{% %}
вы должны поместить в блок комментариев YAML, так как на верхнем уровне вы имеете сопоставление и должны иметь только пары ключ-значение. Один из способов добиться этого - переопределить начало как #% %#
(вам необязательно менять конец, но я предпочитаю симметрию).
Затем после обновления запустите правильный 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 в комментариях встречается в начале файла, вы можете обойти это с помощью этого конкретного примера, но в общем случае этого не произойдет.
Я обновил свой ответ с полным рабочим примером. Простите, что это заняло много времени, чтобы вернуться к этому. – Anthon