生成.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