Python解释器如何逐行运行以下代码?

11

我读过解释器一行一行地运行代码并在同一时间报告任何错误并停止进一步执行的内容。

因此,在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"?

你在哪里读到的? - Rob Kennedy
我最初在我的计算机基础书中读到了这个。 - dlp96
5个回答

10

这取决于你如何运行Python解释器。如果你给它一个完整的源文件,它会先解析整个文件并将其转换为字节码,然后再执行任何指令。但是,如果你逐行输入代码,它将逐块解析和执行:

  • python script.py:解析整个文件
  • python < script.py:逐块解析和执行

后者通常是交互式使用或通过类似于idle的GUI shell使用的方式。


5
Python 被认为是一种完全解释性语言的观点是错误的。当 CPython 运行一个脚本时,源代码会被解析(这里会捕捉到语法错误),并编译成字节码(有时这些字节码会缓存在你的目录中作为 .pyc 文件),在任何东西被执行之前。在这方面上 Python 与 Java 或 C# 并没有根本区别,除了它不花费太多时间进行优化,并且我相信字节码被逐个指令解释,而不是被 JIT 编译成机器码(除非您使用像 PyPy 这样的工具)。

2
因为你对解释器的理解有误。虽然对于某些错误子集,你所描述的行为是可能发生的,但对于许多(大多数?)错误情况来说,这并不是常见情况。
如果解释器可以构建出它认为是有效的程序,但在运行时存在错误,则会发生你所描述的情况。
由于你指出的情况是语法错误,导致无法构建有效的程序,因此行为就像你所看到的那样。

解释器逐行执行代码是什么意思?这意味着它一次解析一行并执行该行,还是仅一次解析一行,如果没有任何语法错误,则移动到下一行进行解析,然后在解析整个文件后执行字节码,前提是所有行中都没有任何错误? - dlp96
1
它解析整个程序。如果遇到阻止创建有效字节码的错误,则在该阶段抛出错误,程序的任何行都不会运行。如果成功构建了其认为是程序的有效字节码版本,则运行该程序。如果遇到运行时错误,则抛出错误并停止在发生错误的行处执行程序。 - jwpfox

0

步骤1:

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

步骤2:

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

步骤3:

字节码发送到Python虚拟机(PVM)。在这里,字节码再次在PVM上执行。如果在执行过程中发生错误,则会显示错误消息并停止执行。因此,在您的情况下,“无效语法”错误是由步骤1引起的。但实际的打印函数是在步骤3执行的。步骤3是在步骤1之后才进行的...我现在明白了。


0
我这样理解:
Python 在代码进入字节码状态后,逐行运行代码。
与其他语言(如 C++)的编译不同之处在于,每次运行脚本时都必须进行解释过程。
Python 解释器每次运行脚本时都会解释代码。
在 C++ 中,您编译程序后,可以执行它,而无需再次编译,除非您想更改系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接