您可以使用该
eval(string)方法来执行此操作。
定义
eval(pre, 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_pre(), {'contrivedExample':__main__}, {'hi':hello}.update(locals()))这在评估线上的作用是:
- 给当前模块另一个名称(该名称成为
contrivedExample
脚本名称)。消费者可以立即致电contrivedExample.hello()
。) - 它定义
hi
为指向hello
- 它将该字典与执行模块中的当前全局变量列表结合在一起。
失败
事实证明(感谢评论者!)您实际上需要使用该
exec语句。哎呀 修改后的示例如下:
exec
定义
(这看起来很熟悉!)Exec是一条语句:
exec "pre" [in scope]其中scope是局部变量和全局变量的字典。如果未指定,它将在当前范围内执行。
该代码只是标准的Python代码-这意味着仍然需要适当缩进。
exec
例
exec "print('hello')"将打印
hello到控制台。您还可以指定要使用的代码的局部和全局变量:
eval "print('hello, '+name)" in {'name':'person-b'}exec
安全问题
不过要小心。任何用户输入都将被执行。考虑:
exec "import os;os.system('sudo rm -rf /')"打印声明
正如评论者所指出的那样,它
from __future__import print_statement。否则,请使用:
print "hello"
代替 :
print("hello")


