python 是如何运行程序
python 是如何运行程序
python 解释器
python解释器是让程序运行起来的程序。当你编写了一段python代码,python解释器会将读取该程序,并且按照其中的命令执行,得出结果。
当python包安装在机器上后,它会生成一些组件: 至少包括一个解释器和一套支持库。
Python视角下如何运行代码
当你写完代码之后,使用python解释器运行代码的流程大致如下:
第一步 : 将源代码编译成所谓的字节码。
第二步: 将字节码转发到所谓的虚拟机中。
第三步: 在虚拟机中按照顺序执行代码。
字节码编译
执行程序时,编译器会将源代码编译成所谓的字节码形式。编译是一个翻译步骤,字节码是一个低级的、与平台无关的表现形式。这也是为什么python代码是跨平台的。并且由于虚拟机执行的是字节码,而不是一条一条文本,其速度相对来说是比较快的,但是比编译型语言来说速度还是较慢。
当执行python test.py指令时,python解释器会先生成一个.pyc文件,在3.2版本之后,python默认将.pyc文件放在当前目录下的__pycache__中。

这里需要注意的是:如果你之前已经生成了.pyc文件之后,没有修改过源代码,那么.pyc文件就不会被更新,直接运行即可,不需要再次编译。
- 源文件的改变:
python会自动检查源文件和字节码文件最后一次修改的时间戳,确认它是否必须重新编译;如果你编辑后又保存了源代码,下次程序运行时,字节码将会被重新创建。 python的版本: 导入机制同时检查是否需要因为使用了不同python版本而重新编译。3.2版本之后有关编译器版本的内容存储在了.pyc文件名当中。
还有一点就是字节码只会针对被导入的文件而生成,而不是顶层的执行脚本。
我们可以看上述图片中显示的那样,在同一个目录中有两个.py文件,分别是statement-syntax.py和user.py其中user被导入到statement-syntax中,所以__pycache__只有user*.pyc而没有statement*.pyc。
python 虚拟机
一旦字节码文件被生成,之后就可以将该字节码发送到PVM (Python Virtual Machine)中。PVM本质就是迭代运行字节码指令的一个大循环,一个接一个地完成操作。PVM是Python运行引擎,它表现为python系统的一部分,并且是实际运行脚本的组件。
PVM与Go中的runtime是不一样的,Go中的runtime是将rumtime代码和用户代码一起打包到了程序当中,当运行程序的时候直接运行即可,不需要额外的依赖。但是python不行,当你生成了源文件之后,你必须要有python解释器才可以运行代码,并且PVM是python解释器的最后一步,执行代码。
