python在开始运行时真正做什么?

python在开始运行时真正做什么?,python,syntax-error,Python,Syntax Error,我了解到SyntaxError是唯一无法捕获的错误。 例如: if __name__ == "__main__": print "main running" try: for i in range(3): except SyntaxError,e: print "error caught" finally: print "i am here" 嗯,我希望打印“主运行”可以显示,但它没有 那么python在运行之

我了解到SyntaxError是唯一无法捕获的错误。 例如:

if __name__ == "__main__":
    print "main running"  
    try:
        for i in range(3):
    except SyntaxError,e:
        print "error caught"
    finally:
        print "i am here"
嗯,我希望打印“主运行”可以显示,但它没有 那么python在运行之前是否检查了所有语法?

python首先将代码编译为字节码。如果失败,将引发一个
SyntaxError
,指示编译失败

因此,您无法从模块中捕获本身存在语法错误的
SyntaxError
异常。由于Python会根据需要编译文件,因此可以捕获导入模块的
SyntaxError
异常

以下打印
导入测试失败

test.py

catchsyntaxerror.py

然后运行
python catchsyntaxerror.py

python首先将代码编译成字节码。如果失败,将引发一个
SyntaxError
,指示编译失败

因此,您无法从模块中捕获本身存在语法错误的
SyntaxError
异常。由于Python会根据需要编译文件,因此可以捕获导入模块的
SyntaxError
异常

以下打印
导入测试失败

test.py

catchsyntaxerror.py


然后运行
python-catchsyntaxerror.py

在运行时无法检测
SyntaxError
,因为无效语法会损害整个模块的有效性,而不仅仅是作者认为出错的特定行的有效性。由于解释器不理解作者的意图,因此在未能读取源代码后,它唯一能做的就是提出错误

正如Martin Pieters所回答的,失败发生在编译步骤,Python在运行模块之前读取整个模块并将其编译到内存中。但是,即使没有单独的编译步骤,在运行时捕获内联语法错误的根本问题仍然存在

要在同一模块中捕获运行时的语法错误,必须将错误代码与周围代码隔离开来。这可以使用
exec
语句或
eval
函数来完成:

>>> try:
...     exec """
... this doesn't work  
... """
... except SyntaxError:
...     print "fail"
... 
fail

要捕获导入模块中的语法错误,只需在
import
语句周围放置
try
/
除外。

在运行时无法检测
SyntaxError
,因为无效的语法会损害整个模块的有效性,不仅仅是作者认为犯了错误的那一行。由于解释器不理解作者的意图,因此在未能读取源代码后,它唯一能做的就是提出错误

正如Martin Pieters所回答的,失败发生在编译步骤,Python在运行模块之前读取整个模块并将其编译到内存中。但是,即使没有单独的编译步骤,在运行时捕获内联语法错误的根本问题仍然存在

要在同一模块中捕获运行时的语法错误,必须将错误代码与周围代码隔离开来。这可以使用
exec
语句或
eval
函数来完成:

>>> try:
...     exec """
... this doesn't work  
... """
... except SyntaxError:
...     print "fail"
... 
fail

要捕获导入模块中的语法错误,只需在
import
语句周围放置
try
/
,除了

您的意思是它编译到.pyc?@cui:
.pyc
文件是字节码缓存,存储编译结果,是的。@cui如果您只是运行脚本(而不是导入模块),Python将把脚本编译到内存中。@Martijn Pieters我试过了,真的如你所说。python似乎只是试图从main.py中找到明显的语法,它在运行时检查导入的文件SyntaxError您的意思是它编译到.pyc?@cui:the
.pyc
文件是字节码缓存,存储编译结果,是的。@cui如果您只是运行脚本(而不是导入模块),Python将把脚本编译到内存中。@Martijn Pieters我试过了,真的如你所说。python似乎只是试图从main.py中找到明显的语法,它在运行时检查导入的文件SyntaxError
>>> try:
...     exec """
... this doesn't work  
... """
... except SyntaxError:
...     print "fail"
... 
fail