您可以使用该eval(string)
方法来执行此操作。
eval(code, globals=None, locals=None)
该代码只是标准的Python代码-这意味着仍然需要适当缩进。
全局变量可以有一个自__builtins__
定义的定义,这对安全性很有用。
eval("print('Hello')")
将打印hello
到控制台。您还可以指定要使用的代码的局部和全局变量:
eval("print('Hello, %s'%name)", {}, {'name':'person-b'})
不过要小心。任何用户输入都将被执行。考虑:
eval("import os;os.system('sudo rm -rf /')")
eval("import os;...", {'os':None})
这将引发异常,而不是擦除硬盘驱动器。当您的程序是桌面程序时,如果人们重新分配脚本(这可能是我想像的),那么这可能是个问题。
这是一个eval
非常奇怪地使用的示例:
def hello() : print('Hello')
def world() : print('world')
CURRENT_MOOD = 'happy'
eval(get_code(), {'contrivedExample':__main__}, {'hi':hello}.update(locals()))
这在评估线上的作用是:
事实证明(感谢评论者!)您实际上需要使用该exec
语句。哎呀 修改后的示例如下:
(这看起来很熟悉!)Exec是一条语句:exec "code" [in scope]
其中scope是局部变量和全局变量的字典。如果未指定,它将在当前范围内执行。
该代码只是标准的Python代码-这意味着仍然需要适当缩进。
exec "print('hello')"
将打印hello
到控制台。您还可以指定要使用的代码的局部和全局变量:
eval "print('hello, '+name)" in {'name':'person-b'}
不过要小心。任何用户输入都将被执行。考虑:
exec "import os;os.system('sudo rm -rf /')"
正如评论者所指出的那样,它print
是3.0之前的所有Python版本中的声明。在2.6中,可以通过键入来更改行为from __future__import print_statement
。否则,请使用:
print "hello"
代替 :
print("hello")