深入理解 python 虚拟机:pyc 文件结构

生成.pyc文件,正常Python文件通过编译器转为字节码,交由Python虚拟机执行。整体流程如下:直接使用compile all模块生成对应文件.pyc。使用命令python -m compileall .扫描目录下所有.py文件,并生成.pyc文件。第一部分魔数由两部分组成,包含整数和回车换行符,用于将来复现编译结果。在不同Python版本中值不...
深入理解 python 虚拟机:pyc 文件结构
深入理解python虚拟机:pyc文件结构

本文主要介绍.py文件编译后的.pyc文件结构,其中核心内容是Python字节码。

.pyc文件是Python解释执行源代码时生成的一种字节码文件,包含源代码的编译结果和元数据信息,加速代码加载执行。

作为解释型语言,Python在运行代码前编译成字节码,解释器解释执行字节码。.pyc文件是这一过程的产物。

首次执行.py文件时,Python会在同一目录生成对应.pyc文件,供下次快速执行。源文件修改后重新加载时,解释器会生成新的.pyc文件更新缓存字节码。

生成.pyc文件,正常Python文件通过编译器转为字节码,交由Python虚拟机执行。整体流程如下:

直接使用compile all模块生成对应文件.pyc。

使用命令python -m compileall .扫描目录下所有.py文件,并生成.pyc文件。

第一部分魔数由两部分组成,包含整数和回车换行符,用于将来复现编译结果。在不同Python版本中值不同,如python3.5为3351,python3.9可能为3420至3424等。

第二部分Bit Field用于复现编译结果,但在python3.9a2中值全为0。详细内容参考PEP552。

第三部分是源文件大小。

第四部分是最重要的CodeObject对象序列化数据,后续详细解析。

具体分析.pyc文件,以python代码为例,.pyc文件十六进制表示如下:

使用代码读取.pyc文件头部元信息如下:

详细操作可查看python标准库importlib/_bootstrap_external.py文件源代码。

CodeObject是CPython中包含Python代码字节码、常量、变量等信息的对象,以及运行代码元数据。执行模块或函数时,解释器先编译为CodeObject,再执行。

CodeObject不可变,一旦创建不能修改,因为Python代码字节码不可变,CodeObject包含这些字节码,所以也不可变。

本篇文章重点介绍CodeObject主要部分及作用,后续文章将详细解析CodeObject对应源代码和字段功能。

以pycdemo.py的.pyc文件为例,pycdemo.py源程序如下:

加载pycdemo01.cpython-39.pyc文件(即hello.py对应的.pyc文件)的代码如下,使用marshal读取.pyc文件内的code object。

执行输出结果如下:

Code object各个字段作用如下:

总结:本文介绍了Python文件编译后结果文件.pyc的结构,重点解释了CodeObject对象及其字段作用。后续文章将提供详细例子,正确理解这些字段含义,有助于深入理解Python虚拟机。

本篇文章是深入理解Python虚拟机系列文章之一,更多内容可访问项目地址:github.com/Chang-LeHung...

更多计算机知识请访问项目:github.com/Chang-LeHung...

关注公众号:一无是处的研究僧,了解更多计算机(Java、Python、计算机系统基础、算法与数据结构)知识。2024-11-19
mengvlog 阅读 7 次 更新于 2025-07-20 04:19:57 我来答关注问题0
檬味博客在线解答立即免费咨询

Python相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部