Python程序运行原理图文解析
本文详细解析Python程序的运行原理,涵盖编译型与动态语言特性。重点讲解def指令如何创建函数对象、dir函数的作用,以及pyc文件的三大生成条件。深入剖析PyCodeObject对象的结构与内存管理,并阐明import指令在模块加载、代码执行及符号绑定中的关键作用,帮助开发者深入理解Python底层执行机制。
本文主要探讨Python程序的运行原理,具体介绍如下内容。
编译型语言(以C语言为例)

动态类型语言

一个程序具体是如何运行起来的?以下面的代码为例进行说明。
#othermodule.py def add(a, b): return a + b #mainrun.py import othermodule a = ['xiaoke', 1, 'python'] a = 'xiaoke string' def func(): a = -5 b = 257 print(a + b) print(a) if __name__ == '__main__': func() res = othermodule.add(1, 2) print(res)
原理分析


dir 函数
Python 提供的内置函数 dir 可用于查看特定命名空间下的所有名称符号。其主要用途之一是查看某个命名空间(如类、函数或 module)的所有属性和方法。
例如,调用 dir() 可查看当前命名空间,而调用 dir(sys) 则可查看 sys 模块的内容。
def 指令
在字节码指令层面,def func() 对应的是 MAKE_FUNCTION 指令。Python 作为动态语言,def 实际上是在执行一条创建函数的指令(class 则是创建类的指令),而不仅仅是一个语法关键字。函数并非预先创建,而是在代码执行到该处时才被创建。
执行 def func() 会创建一个名为 func 的函数对象。具体过程是先创建该函数对象,然后将名称符号 func 绑定到这个函数对象上。
pyc文件
pyc 文件是 PyCodeObject 对象在硬盘上的持久化表现形式。生成 pyc 文件的命令如下:
python -m py_compile xx_module.py
pyc文件的三大作用机制
- 1. 时间戳检查:若 py 文件的创建时间晚于 pyc 文件,则重新生成 pyc 文件。
- 2. Magic num 版本检测:若 Python 运行版本不同,则重新生成 pyc 文件。
- 3. 编译结果缓存:PyCodeObject 对象在运行期间仅存在于内存中。当模块代码执行完毕后,编译结果会被保存至 pyc 文件,以便下次直接加载到内存,避免重复编译。
在运行期间,编译结果即 PyCodeObject 对象,仅存在于内存中。当该模块的 Python 代码执行完毕后,会将编译结果保存至 pyc 文件,这样下次无需再次编译,可直接加载到内存中运行。
PyCodeObject 对象包含了 Python 源代码中的字符串、常量值,以及通过语法解析后编译生成的字节码指令。此外,该对象还会存储字节码指令与原始代码行号的对应关系,从而在出现异常时能够准确指明错误所在的代码行号。
import 指令
import 指令用于载入 module,必要时会执行编译操作。但 import 指令还执行一项重要任务:导入的 module 的代码会被完整执行一遍。这一点至关重要,因为 Python 是解释执行的,函数也是在执行时才创建的。如果不执行 module 的代码,其中的函数将无法创建,自然也无法被调用。
执行代码的另一个重要作用是,在该 module 的命名空间中,创建模块内定义的函数和各种对象的符号名称(即变量名),并将这些名称绑定到相应的对象上。这样,其他 module 才能通过变量名来引用这些对象。
Python 虚拟机还会将已经 import 过的 module 缓存起来,存入全局 module 集合 sys.modules 中。这样做的好处是,如果程序在其他地方再次 import 该模块,Python 虚拟机只需从全局 module 集合中返回缓存的 module 对象即可,无需重复加载。
总结
以上就是本文关于Python程序运行原理图文解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









