отрендерить и загрузить файл yaml в python - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь загрузить файл yaml в формате jinja2 и «оценить» / «сделать» шаблон.Вот пример:

{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}

Я хотел бы иметь возможность загрузить файл yaml и сказал, что yaml ['package'] ['version'] = 0.3.3

У меня естьпопробовать руамель YAML, но он не оценивает версию, а только дай мне пакет.

здесь код питона:

yaml = YAML(typ='jinja2')
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(content)
print (yaml_content['package'])

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Не уверен насчет ruamel.yaml, но вы легко можете сделать то, что вы хотите, с пакетом jinja2 и пакетом pyyaml:

from jinja2 import Environment, BaseLoader
import yaml

content = '''{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}'''

yaml_content = yaml.safe_load(Environment(loader=BaseLoader()).from_string(content).render())
print(yaml_content['package']['version'])

Это выводит:

0.3.3
0 голосов
/ 01 марта 2019

Я не уверен, что у вас есть полный пример, но вот что я получил, чтобы заставить его работать.Если я правильно понял, вы хотите загрузить файл jinja, а затем получить значения через ruamel.yaml package

from ruamel.yaml import YAML
from jinja2 import Environment, FileSystemLoader

jinja = Environment(loader = FileSystemLoader('.'), trim_blocks=True, lstrip_blocks=True)
template = jinja.get_template('sample.yml')
yaml=YAML()
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(template.render())
print (yaml_content['package'])
#sample.yml
{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}

package:
  name: {{ name|lower }}
  version: {{ version }}

Результат:

{'name': 'pyexcel-ezodf', 'version': '0.3.3'}

Относительно использования typ='jinja2' неподдерживается ruamel, если у вас нет некоторых пользовательских настроек, поскольку это дает следующее:

NotImplementedError: typ "jinja2"not recognised (need to install plug-in?)

0 голосов
/ 01 марта 2019

Загрузка шаблонов jinja2 для YAML с параметром typ='jinja2', переданным в экземпляр ruamel.yaml 'YAML(), предназначена для того, чтобы сделать действительный YAML из шаблона, поэтому вы можете затем изменить шаблон, как если бы он был действительным YAMLи напиши это обратно.Он не выполняет никакого рендеринга шаблонов и не претендует на то, чтобы делать это где-либо в документации.

Что вам нужно сделать, это сначала отрендерить шаблон с использованием jinja2, а затем загрузить значение (для которого вы можете использоватьопция fast yaml = YAML(typ='safe').

Вы можете, например, сделать что-то вроде:

from jinja2 import Environment
from ruamel.yaml import YAML

yaml = YAML(typ='safe')
yaml_content = yaml.load(Environment().from_string(content).render())
print(yaml_content['package'])
...