python解释器如何在以下代码中逐行运行代码?

时间:2016-09-04 04:58:07

标签: python syntax-error interpreter

我已经读过解释器逐行运行代码并同时报告错误并停止进一步执行。 所以在python中,考虑文件ex1.py

print "Hello world"
12variable = 'bye'
print 12variable

现在根据解释器的工作,解释器将运行第一行,即它首先打印hello world,然后在下一行显示语法错误(逐行工作)。因此预期的输出是:

Hello world
12variable = 'bye'
         ^
SyntaxError: invalid syntax

但实际输出是 -

12variable = 'bye'
         ^
SyntaxError: invalid syntax

为什么不在第一次打印Hello World

5 个答案:

答案 0 :(得分:8)

这取决于你如何运行Pythoninterpréter。如果你给它一个完整的源文件,它将首先解析整个文件并在执行任何指令之前将其转换为字节码。但是如果你逐行提供它,它将解析并执行代码 bloc by bloc

  • python script.py:解析完整档案
  • python < script.py:由bloc解析并执行

后者通常是您以交互方式或通过idle等GUI shell使用它的方式。

答案 1 :(得分:5)

Python是一种完全解释的语言,这是一个神话。当CPython运行脚本时,源代码被解析(这是它将捕获语法错误的地方),并在执行任何操作之前编译成字节码(有时这些字节码作为SDL_GetWindowWMInfo文件缓存在您的目录中)。在这方面,Python并不是完全不同于Java或C#,除了它不花费太多时间进行任何优化,我相信字节码一次解释一条指令,而不是JITed到机器代码(除非你正在使用像PyPy这样的东西。

答案 2 :(得分:2)

因为您对翻译的理解是错误的。虽然您所描述的行为可能是针对错误子集发生的,但对于许多(大多数?)错误而言,这并不常见。

如果解释器可以构造它认为是有效程序但是在运行时出错,那么你所描述的将会发生。

由于您指向的情况是语法错误,导致无法构造有效程序,因此行为就像您所看到的那样。

答案 3 :(得分:0)

我这样理解:

Python在字节代码状态后逐行运行代码。

这个东西和编译(在其他语言如C ++中)之间的区别在于,每次运行脚本时都必须执行此解释过程。

每次运行脚本时,Python解释器都会解释代码。

在C ++中,您可以编译程序,除非您想要更改系统,否则无需再次编译即可执行它。

答案 4 :(得分:0)

第1步:

解释器读取python代码或指令。然后,它会验证该指令的格式是否正确,即它会检查每行的语法。如果遇到错误,它将立即停止翻译并显示错误消息。

第2步:

如果没有错误,即python指令或代码格式正确,则解释器将其翻译成等效的形式,称为“字节码”的中间语言。因此,在成功执行Python脚本或代码后,它已完全转换为字节码。

第3步:

字节代码发送到Python虚拟机(PVM)。再次,字节代码在PVM上执行。如果在此执行过程中发生错误,则会中止执行,并显示一条错误消息。 因此,在您的情况下,由于步骤1,将引发“无效语法”错误。但是,实际的打印功能要在第3步执行。第3步只在第1步之后才开始...我想现在就可以了。