WEB开发网
开发学院软件开发Python Python 2.6.2的.pyc文件格式 阅读

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结束。文件结束

1 2 3 4  下一页

Tags:Python pyc 文件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接