Eval不能处理多行字符串

时间:2015-06-05 16:35:23

标签: python eval

我在使用python eval函数/

执行多行字符串时遇到问题
code = ''' 

def main():
  print "this is a test"

main()

'''

eval(code)

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    eval(code)
  File "<string>", line 3
    def main():
      ^
SyntaxError: invalid syntax

1 个答案:

答案 0 :(得分:6)

eval只能评估Python expressions,而不能评估语句。函数定义是一个语句,而不是表达式。

使用exec执行Python语句。

请参阅Top-level components document,它区分了file inputexpression input之间(以及其他):

file_input ::=  (NEWLINE | statement)*
     

此语法用于以下情况:

     

[...]

     
      
  • 解析传递给exec语句的字符串时;
  •   

  

[...] eval()的字符串参数必须具有以下格式:

eval_input ::=  expression_list NEWLINE*

NOT 使用它来执行不受信任的用户提供的文本。 eval()exec没有防范恶意用户,如果您使用此功能,他们可以 接管网络流程。

事实上,没有“安全”的方法可以做到这一点,除了在丢弃的虚拟机中运行代码,所有服务都被牢牢关闭。为新代码运行新虚拟机,完成后或超时后丢弃整个虚拟机。