python字节码解析_Python 字节码是什么?能吃吗?

本文详细介绍了Python的字节码工作原理,包括如何将源代码编译为字节码,pyc文件的生成与作用,以及字节码的结构和解析。通过dis模块,我们可以分析Python字节码,理解其运行机制,例如在for循环、while循环等控制结构中的表现。字节码的使用提高了Python的加载速度,并提供了深入理解Python执行过程的途径。
摘要由CSDN通过智能技术生成

     pPython是一门解释型语言,边解释边执行(效率比C低,暴力脚本经常炸),通常不会进行整体地编译和链接,使用专门的解释器逐行编译解释成特定字节码,其工作流程如下: 

    1. 将源代码编译转换为字节码

    2. 解释器执行字节码(是不是像虚拟机?)

0 1pyc文件的生成

    pyc 文件是 py 文件编译后生成的字节码文件,在 __pycache__ 目录中。

    其目的是提高加载速度:运行时会检查字节码文件修改时间是否与源代码一致,一致则编译步骤将会被跳过,解释器直接加载 pyc 文件;否则编译保存新生成的字节码。 

    一般以 module 形式加载时,会生成 pyc 文件。

    pyc 文件生成方式有很多,如下列举了几种:

1命令
python -m test
2代码

1  生成单个 pyc 文件

    py_compile 编译

import py_compile py_compile.compile(r'path/test.py')

     load_module 间接加载

import impdef generate_pyc(name):    fp, pathname, description = imp.find_module(name)             try:        imp.load_module(name, fp, pathname, description)    finally:        if fp:            fp.close()if __name__ == '__main__':    generate_pyc(input())

2  批量生成 pyc 文件

import compileall compileall.compile_dir(r'path')
0 2pyc文件格式解析

pyc文件一般由三个部分组成:

  • 最开始 4 个字节是一个 Maigc int,标识此 pyc 的版本信息,不同的版本的 Magic 都在 python/import.c 内定义 

  • 接下来 4 个字节还是个 int,是 pyc 产生的时间(TIMESTAMP, 1970.01.01 到产生 pyc 时候的秒数)

  • 接下来是个序列化了的 PyCodeObject,此结构在 Include/code.h 内定义,序列化方法在 python/marshal.c 内定义 

    康一个实例(Python2.7,010editor template 用官方 PYC.bt)

print(2333)

6a04c8744f23348b9490e4ae98cdd23c.png

struct Magic magic       0A0DF303h char mtime[4]            5E6E3AB6h TYPE_CODE (63h)    int co_argcount         0h     int co_nlocals          0h     int co_stacksize        1h     int co_flags            40h     struct PyObject code         enum ObjType type                  TYPE_STRING (73h)         int n                              9h         64 00 00 47 48 64 01 00               struct Instruction inst[0]     LOAD_CONST 0         opcode 64h oparg 0h               struct Instruction inst[1]     PRINT_ITEM           opcode 47h                       struct
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值