Python Eval不处理多行字符串

Python Eval不处理多行字符串,python,eval,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 de

我在使用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
code=''
def main():
打印“这是一个测试”
main()
'''
评估(代码)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
评估(代码)
文件“”,第3行
def main():
^
SyntaxError:无效语法

eval
只能求值,不能求值语句。函数定义是语句,而不是表达式

用于执行Python语句

请参阅,它(除其他外)区别于和:

此语法用于以下情况:

[……]

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

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

eval_input ::=  expression_list NEWLINE*
请勿使用此选项执行不受信任的用户提供的文本
eval()
exec
不会防范恶意用户,如果您使用此功能,他们可以并且将接管web进程


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

通常不建议使用
eval
。你为什么要这么做呢?我正在写一个python自动分级器,它首先必须执行烧瓶上GET请求接收到的代码Server@JohnGalt:那么您想执行从web客户端发送给您的任意代码?这是一个即将发生的安全漏洞,用户发送的任何东西都可以轻松接管您的web进程。我知道,但是我会有一个防止文件操纵、sql注入和其他安全漏洞的保护系统。我仍然可以用exec存储代码的评估吗?我想补充一点,你试图做的事情听起来有点像糟糕的设计,除非你真的知道你在做什么。但谁知道约翰·高尔特在干什么?@JohnGalt:表达式有值,语句不需要。例如,函数
def
没有值,它只是定义函数(然后本地名称空间中有一个条目有值,即
Callable
,但这是另一回事!)@JohnGalt:这就是它被称为
eval
:它可以计算表达式的值的原因。没有价值的东西不能被
eval
ed,即使你可以,也不会有价值。
eval_input ::=  expression_list NEWLINE*