如何从输入文件中运行字符串作为python代码?

时间:2017-10-24 20:02:35

标签: python-3.x

我在文字冒险游戏中创造了一些东西。我有一个.yaml文件,这是我的输入。这个文件看起来像这样

node_type: 
  action
title: 
  Do some stuff
info: 
  This does some stuff and things
script:
  'print("hello world")
  print(ret_val)
  foo.bar(True)
  ret_val = (foo.bar() == True)
  if (thing):
      print(thing)
  print(ret_val)
  '

我的最终目标是让我的python程序运行yaml文件的脚本部分,就像它已经被复制粘贴到主代码中一样。(我知道有大约十几个安全原因我不应该像这样运行用户输入,但我是唯一一个编写这些节点的人,也是唯一一个使用这个程序的人,所以我大多只是忽略了这个事实......)

目前我的尝试是这样的:我使用pyyaml将我的yaml文件加载为dict

node = yaml.safe_load(file.yaml)

然后我尝试使用exec运行我的代码并遇到很多问题,我无法运行if语句,我只是得到语法错误,而且我无法得到任何类型的从我的代码中返回值。我试过这个作为一种解决方法:

def main()
    ret_val = "test";
    thing = exec(node['script'], globals(),locals())
    print(ret_val)

当使用上述.yaml文件运行时打印

>> hello world
>> test
>> True
>> test   

由于某些原因,即使我将它们提供给exec,也没有实际修改我的任何主要变量。

我有什么方法可以解决这些问题,还是有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是解析代码并将其保存到.py文件,从中可以动态导入该文件,例如importlib

您可能希望将已解析的代码封装到一个函数中,然后您可以轻松调用该函数来调用您的操作。此外,在那里指定一些默认导入是有意义的。