python 是如何运行程序

python 解释器

python解释器是让程序运行起来的程序。当你编写了一段python代码,python解释器会将读取该程序,并且按照其中的命令执行,得出结果。

python包安装在机器上后,它会生成一些组件: 至少包括一个解释器和一套支持库。

Python视角下如何运行代码

当你写完代码之后,使用python解释器运行代码的流程大致如下:

第一步 : 将源代码编译成所谓的字节码

第二步: 将字节码转发到所谓的虚拟机中。

第三步: 在虚拟机中按照顺序执行代码。

字节码编译

执行程序时,编译器会将源代码编译成所谓的字节码形式。编译是一个翻译步骤,字节码是一个低级的、与平台无关的表现形式。这也是为什么python代码是跨平台的。并且由于虚拟机执行的是字节码,而不是一条一条文本,其速度相对来说是比较快的,但是比编译型语言来说速度还是较慢。

当执行python test.py指令时,python解释器会先生成一个.pyc文件,在3.2版本之后,python默认将.pyc文件放在当前目录下的__pycache__中。

image-20260326191112768

这里需要注意的是:如果你之前已经生成了.pyc文件之后,没有修改过源代码,那么.pyc文件就不会被更新,直接运行即可,不需要再次编译。

  • 源文件的改变: python会自动检查源文件和字节码文件最后一次修改的时间戳,确认它是否必须重新编译;如果你编辑后又保存了源代码,下次程序运行时,字节码将会被重新创建。
  • python的版本: 导入机制同时检查是否需要因为使用了不同python版本而重新编译。3.2版本之后有关编译器版本的内容存储在了.pyc文件名当中。

还有一点就是字节码只会针对被导入的文件而生成,而不是顶层的执行脚本。

我们可以看上述图片中显示的那样,在同一个目录中有两个.py文件,分别是statement-syntax.pyuser.py其中user被导入到statement-syntax中,所以__pycache__只有user*.pyc而没有statement*.pyc

python 虚拟机

一旦字节码文件被生成,之后就可以将该字节码发送到PVM (Python Virtual Machine)中。PVM本质就是迭代运行字节码指令的一个大循环,一个接一个地完成操作。PVMPython运行引擎,它表现为python系统的一部分,并且是实际运行脚本的组件。

PVMGo中的runtime是不一样的,Go中的runtime是将rumtime代码和用户代码一起打包到了程序当中,当运行程序的时候直接运行即可,不需要额外的依赖。但是python不行,当你生成了源文件之后,你必须要有python解释器才可以运行代码,并且PVMpython解释器的最后一步,执行代码。

image-20260326193209367