如何在Python中计算任意代码?

如何在Python中计算任意代码?,python,Python,我希望能够从Python中的字符串计算任意代码,包括由多个语句组成的代码,以及跨多行的语句。到目前为止,我尝试的方法是使用exec和eval,但它们似乎只能计算表达式。我也尝试过这个类,但这似乎只允许使用eval、exec或单语句模式进行计算。我尝试过逐行拆分代码,但这无法处理跨多行的语句。有办法做到这一点吗?exec似乎就是您想要的: s = """ for i in range(5): print(i) """ exec s 印刷品 0 1 2 3 4 eval()只处理表达式,

我希望能够从Python中的字符串计算任意代码,包括由多个语句组成的代码,以及跨多行的语句。到目前为止,我尝试的方法是使用
exec
eval
,但它们似乎只能计算表达式。我也尝试过这个类,但这似乎只允许使用
eval
exec
或单语句模式进行计算。我尝试过逐行拆分代码,但这无法处理跨多行的语句。有办法做到这一点吗?

exec
似乎就是您想要的:

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

0
1
2
3
4

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

exec
似乎就是您要寻找的:

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

0
1
2
3
4

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

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

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

exec
还有一个
格式的
,您可以在其中将计算结果插入一个名称空间,这个名称空间比当前名称空间好。

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

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

exec
还有一个
格式的
,您可以在其中将计算结果插入一个名称空间,这个名称空间比当前名称空间更好。

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

exec "code" in globals()
或者,如果您想指定自己的名称空间,请给它一个dict

di = {}
exec "code" in di

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

exec "code" in globals()
或者,如果您想指定自己的名称空间,请给它一个dict

di = {}
exec "code" in di

Python 3的更新:
print
一样,
exec
现在必须与括号一起使用:

exec("print(1)")

行为中的某些内容发生了更改,请参见Python 3的更新:

print
一样,
exec
现在必须与括号一起使用:

exec("print(1)")

行为上有些变化,请看

是的,看起来你是对的,似乎我对exec的看法是错误的。谢谢是的,看来你是对的,看来我误解了exec。谢谢不,你不想要这个。因为它完全不需要,不安全,让人头疼,而且很脏。@delnan:他没有说他在做什么。警告是没有坏处的,但也许他真的想要这个?@Thomas:在有些情况下,这(当然,过度关注验证和/或沙箱)是一种有效的方法。但它们很少见,出于某种原因,相对而言,很多人试图用它来解决问题,而这些问题有更好的解决方案。所以很有可能这就是其中之一。@delnan:让我们让人们从怀疑中受益,至少在我们知道原因之前。无论如何,只有在服务器/客户机模型中才是真正不安全的,在这种模型中,您必须防范可能的恶意用户。如果它是一个运行在用户自己电脑上的程序,他们可以自由地“破解”它。不,你不想这样。因为它完全不需要,不安全,让人头疼,而且很脏。@delnan:他没有说他在做什么。警告是没有坏处的,但也许他真的想要这个?@Thomas:在有些情况下,这(当然,过度关注验证和/或沙箱)是一种有效的方法。但它们很少见,出于某种原因,相对而言,很多人试图用它来解决问题,而这些问题有更好的解决方案。所以很有可能这就是其中之一。@delnan:让我们让人们从怀疑中受益,至少在我们知道原因之前。无论如何,只有在服务器/客户机模型中才是真正不安全的,在这种模型中,您必须防范可能的恶意用户。如果是在用户自己的计算机上运行的程序,他们可以自由地“破解”它。