您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页深入理解 python 虚拟机:pyc 文件结构

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

来源:爱玩科技网

有网友碰到这样的问题“深入理解 python 虚拟机:pyc 文件结构”。小编为您整理了以下解决方案,希望对您有帮助:

解决方案1:

深入理解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、计算机系统基础、算法与数据结构)知识。

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务