【问题标题】:execute python script written in yaml with variables使用变量执行用yaml编写的python脚本
【发布时间】:2019-04-06 13:30:31
【问题描述】:

我正在尝试使用 YAML 标量值作为变量执行用 YAML 文件编写的 python 行。

我的代码:

with open("file.yaml", "r") as file:
    yaml_ = yaml.load(file)

eval(yaml_['Code'])

file.yaml:

ToPrint:
  var: something
Code: print("{{var}}")

输出为:{{var}}(我的预期输出:something)。

有没有办法以这种方式打印 YAML 字段?

【问题讨论】:

  • 显示你的真实代码和完整的错误信息。
  • 这是我的真实代码,如果发现我的代码有错误,我就全部更新
  • @xyz YAML 文件中没有字段,该概念不在 YAML 规范中。您指的是映射中的标量(字符串)值。

标签: python python-3.x yaml


【解决方案1】:

我会将 YAML 文件更改为:

ToPrint:
  var: something
Code: print("{var}".format(**d['ToPrint']))

而且由于您使用的是 Python3,所以也使用 Path:

import sys
import ruamel.yaml
from pathlib import Path

yaml = ruamel.yaml.YAML()
d = yaml.load(Path('file.yaml'))
eval(d['Code'])

给出:

something

请注意变量d 必须与值中的变量相同 为Code

{{var}} 的使用看起来更像是一个 (jinja2) 模板。你不能 直接评估那些,你需要扩展模板,然后全部 评估。

【讨论】:

    【解决方案2】:

    你可以使用ToPrint作为eval中的局部变量:

    with open("file.yaml", "r") as file:
        yaml_ = yaml.load(file)
    
    eval(yaml_['Code'], yaml_['ToPrint'])
    

    还有 yaml 文件:

    ToPrint:
      var: something
    Code: print(f"{var}")
    

    【讨论】:

    • 我收到错误:TypeError: globals must be a real dict; try eval(expr, {}, mapping)
    【解决方案3】:

    扩展丹尼尔的回答:

    yaml 文件:

    Const:
        c1: 10
        c2: 20
    Expression: var1 * var2 + c1 / c2
    

    代码:

    import yaml
    
    with open("formula.yaml", "r") as file:
        yaml_ = yaml.load(file)
    
    res = eval(yaml_['Expression'], 
               {'var1':4, 'var2':2}, 
               yaml_['Const'])
    print(res)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2014-05-03
      • 2023-03-25
      • 2013-05-13
      • 2017-09-15
      • 1970-01-01
      • 2014-05-29
      相关资源
      最近更新 更多