Python程序运行原理图文解析

蓝鲸
蓝鲸
发布时间:2026-10-13 | 2人浏览过
原创

本文详细解析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. 1. 时间戳检查:若 py 文件的创建时间晚于 pyc 文件,则重新生成 pyc 文件。
  2. 2. Magic num 版本检测:若 Python 运行版本不同,则重新生成 pyc 文件。
  3. 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程序运行原理图文解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表