Python 解释器执行字节码的完整流程-Python教程

Python字节码由compile()函数或模块首次导入时生成,缓存于__pycache__目录,文件名含版本标识;导入时由importlib加载器解析执行,最终由ceval.c中的eval loop驱动运行。

Python 字节码从哪来:compile() 和 .pyc 文件的生成时机

Python 源代码(.py)不会直接执行,必须先编译成字节码(.pyc),这是 CPython 解释器唯一能“读”的中间表示。编译发生在模块首次被导入时,或显式调用 compile() 函数时。

关键点:

  • .pyc 文件默认缓存在 __pycache__ 目录下,文件名含 Python 版本标识(如 main.cpython-312.pyc),不同版本互不兼容
  • 手动触发编译:code_obj = compile('x = 1 + 2', '', 'exec'),返回可被 exec() 或 eval() 执行的代码对象
  • 修改源码后,CPython 会检查 .py 时间戳与 .pyc 是否匹配,不一致则重新编译

字节码怎么加载:模块导入时的 importlib._bootstrap_external.SourceLoader

导入一个模块时,实际是 importlib 中的加载器在干活。它负责读取 .py 或 .pyc,解析出代码对象(code object),并绑定到模块的 __dict__ 上。

常见误区:

立即学习“Python免费学习笔记(深入)”;

  • import 不等于“执行全部代码”——只执行模块顶层语句,函数/类定义只是生成对象并注册名字,不运行其内部逻辑
  • 如果只有 .pyc 没有 .py,且校验通过(magic number + source hash 匹配),CPython 仍可直接加载执行(适用于分发场景)
  • 使用 -B 启动解释器会跳过写 .pyc;-O 还会丢弃 assert 和 __doc__,生成优化版字节码(co_consts 更小)

字节码怎么跑:CPython 虚拟机核心——ceval.c 的 eval loop

所有字节码最终由 CPython 的求值循环(PyEval_EvalFrameEx,现为 _PyEval_EvalFrameDefault)驱动。它是一个巨大的 switch-case,按 co_code 字节数组逐条取出指令(opcode),查表执行对应 C 函数。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Python 解释器执行字节码的完整流程-Python教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002954+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002955+
  • 本周更新: 0+
  • 最后更新: 2026-03-16