2017-02-07 14 views
1

Я хотел бы иметь возможность читать в питона файл конфигурации дзиндзя YAML, как с помощью библиотеки PyYAML, но я получаю ошибки:YAML и jinja2 читатель

{% 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] 
+1

Я обновил свой ответ с полным рабочим примером. Простите, что это заняло много времени, чтобы вернуться к этому. – Anthon

ответ

1

Ваш вход не действует 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 в комментариях встречается в начале файла, вы можете обойти это с помощью этого конкретного примера, но в общем случае этого не произойдет.

+0

Спасибо @anthon, но знаете ли вы, как программно расширить yaml и прочитать результат с yaml. – ypriverol

+0

Вы можете развернуть конструкцию, прочитав ее через jinja2, вы получите файл и прочитаете этот файл с помощью вашего синтаксического анализатора. – Anthon

+0

У вас есть пример (код фрагмента) Я пробую это раньше и не работал. – ypriverol

 Смежные вопросы

  • Нет связанных вопросов^_^