如何在Python中评估任意代码?

时间:2011-05-31 16:33:18

标签: python

我希望能够从Python中的字符串中评估任意代码,包括由多个语句组成的代码,以及跨越多行的语句。到目前为止我尝试过的方法是使用execeval,但这些方法似乎只能评估表达式。我也尝试了code.InteractiveInterpreter类,但这似乎只允许使用evalexec或单语句模式进行评估。我已经尝试逐行拆分代码,但这无法处理跨越多行的语句。有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:3)

exec似乎正是您所寻找的:

s = """
for i in range(5):
    print(i)
"""
exec s

打印

0
1
2
3
4

eval()只处理表达式,但exec处理任意代码。

答案 1 :(得分:3)

您能告诉我您exec面临的问题吗?这似乎对我有用。

>>> foo = """
... def baz():
...   print "Hello"
... """
>>> 
>>> exec foo
>>> baz()
Hello
>>> 

exec也有一个in表单,您可以在其中将评估结果插入到命名空间中,这比污染当前的更好。

答案 2 :(得分:2)

仅仅基于sven所说的有一个条件部分来使用exec,它允许在内部执行命名空间的规范,例如当你可以在全局命名空间中执行exec代码时

exec "code" in globals()

或者如果你想指定你自己的命名空间,请将它命名为dict

di = {}
exec "code" in di

答案 3 :(得分:0)

针对Python 3的更新print一样,exec现在必须用于括号:

exec("print(1)")

某些行为已更改,请参见this thread