在 python 中渲染和加载 yaml 文件
render and load yaml file in python
我正在尝试加载 jinja2 格式的 yaml 文件和 "evaluate"/"render" 模板。在这里,示例:
{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}
package:
name: {{ name|lower }}
version: {{ version }}
我希望能够加载 yaml 文件并说 yaml['package']['version']=0.3.3
我必须尝试 ruamel YAML 但它不评估版本只给我一个包。
此处 python 代码:
yaml = YAML(typ='jinja2')
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(content)
print (yaml_content['package'])
使用传递给 ruamel.yaml
的 typ='jinja2'
参数加载 YAML 的 jinja2 模板 ruamel.yaml
' YAML()
实例是为了从模板中生成有效的 YAML,然后您可以修改模板就像它是有效的 YAML 一样并将其写回。它不进行任何模板渲染,也没有在文档中的任何地方声称这样做。
您需要做的是首先使用 jinja2 渲染模板,然后加载值(为此您可以使用快速 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'])
不确定 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
我不确定您拥有的完整示例是什么,但这是我要让它发挥作用的方法。如果我理解正确,你想加载一个 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?)
我正在尝试加载 jinja2 格式的 yaml 文件和 "evaluate"/"render" 模板。在这里,示例:
{% set name = "pyexcel-ezodf" %}
{% set version = "0.3.3" %}
package:
name: {{ name|lower }}
version: {{ version }}
我希望能够加载 yaml 文件并说 yaml['package']['version']=0.3.3
我必须尝试 ruamel YAML 但它不评估版本只给我一个包。
此处 python 代码:
yaml = YAML(typ='jinja2')
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml_content = yaml.load(content)
print (yaml_content['package'])
使用传递给 ruamel.yaml
的 typ='jinja2'
参数加载 YAML 的 jinja2 模板 ruamel.yaml
' YAML()
实例是为了从模板中生成有效的 YAML,然后您可以修改模板就像它是有效的 YAML 一样并将其写回。它不进行任何模板渲染,也没有在文档中的任何地方声称这样做。
您需要做的是首先使用 jinja2 渲染模板,然后加载值(为此您可以使用快速 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'])
不确定 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
我不确定您拥有的完整示例是什么,但这是我要让它发挥作用的方法。如果我理解正确,你想加载一个 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?)