Python 2.6.2的.pyc文件格式
2010-09-22 11:25:54 来源:WEB开发网核心提示:.pyc文件是什么? Python源码编译的结果就是PyCodeObject(下面将PyCodeObject的实例简称为“代码对象”),每个作用域会编译出一个对应的代码对象,Python 2.6.2的.pyc文件格式,其中名为co_code的PyStringObject保存着代码对象的字节码,
.pyc文件是什么?
Python源码编译的结果就是PyCodeObject(下面将PyCodeObject的实例简称为“代码对象”),每个作用域会编译出一个对应的代码对象,其中名为co_code的PyStringObject保存着代码对象的字节码。
一个Python源文件就是一个模块。每个模块顶层的代码对象通过marshal序列化之后就得到了.pyc文件。marshal以little-endian字节序来序列化数据。
那嵌套于顶层作用域里面的那些作用域,例如函数、类的定义,它们对应的代码对象在哪里?它们每一个都乖乖的躺在上一层作用域的代码对象的co_const(常量池)域里,所以其实顶层代码对象已经嵌套包含了底下其它作用域的代码对象。
PyCodeObject的结构和marshal的序列化逻辑请参考上一段的两个链接。
Python 2.6.2的.pyc文件的结构
Python .pyc file structure代码
============== <- 文件起始。下面是文件头信息
pyc_magic (=0xD1 0xF2 0x0D 0x0A,4字节,简单校验.pyc的魔数)
mtime (4字节,.pyc对应的源文件的修改时间)
============== <- 顶层PyCodeObject起始。下面都属于顶层代码对象
TYPE_CODE (='c',1字节,PyCodeObject的类型标识)
co_argscount (4字节,位置参数的个数)
co_nlocals (4字节,局部变量(包括位置参数)的个数)
co_stacksize (4字节,求值栈的最大深度)
co_flags (4字节,意义不明)
co_code (PyStringObject,字节码)
co_consts (PyTupleObject,常量池)
co_names (PyTupleObject,所有用到的符号的集合)
co_varnames (PyTupleObject,局部变量名集合)
co_freevars (PyTupleObject,自由变量的变量名集合)
co_cellvars (PyTupleObject,被闭包捕获的局部变量的变量名集合)
co_filename (PyStringObject,源文件名)
co_firstlineno(4字节,该代码对象中源码的首行对应行号)
co_lnotab (PyStringObject,字节码偏移量与源码行号的对应关系)
============== <- 顶层PyCodeObject结束。文件结束
更多精彩
赞助商链接