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

Python 2.6.2的.pyc文件格式

 2010-09-22 11:25:54 来源:WEB开发网   
核心提示: 以上,整型的域都标出了长度,Python 2.6.2的.pyc文件格式(2),其它域则标出了类型,为了能清楚的看到文件头与后面的PyCodeObject的界线, 可是那个62161是怎么来的?通过阅读Include/code.h的注释,可以观察到每个主要的Python发行版本都有一个特别的

以上,整型的域都标出了长度,其它域则标出了类型。为了能清楚的看到文件头与后面的PyCodeObject的界线,用横线特别标注了出来。

因为关键的字节码是存在PyStringObject类型的对象里,该类型通过marshal序列化后的结构也有必要说明:

Pystringobject layout in .pyc files代码   

=========== <- PyStringObject起始
TYPE_STRING(='s',1字节,PyStringObject的类型标识)
length     (4字节,字符串内容的长度)
data       (byte数组,字符串内容)
=========== <- PyStringObject结束

了解这两个结构后,我们可以推出:在Python 2.6.2的.pyc文件中,地址在0x1A开始的4字节整型标识顶层代码对象的字节码的长度,假设长度为len;从0x1E开始,长度为len的数据就是顶层代码对象的字节码。

关于pyc_magic

pyc_magic是两个字节的整数,加上rn(0x0D 0x0A就是rn)。它是这样算出来的:

(Python 2.6a1的Python/import.c)

C代码  

#define MAGIC (62161 | ((long)'r'<<16) | ((long)'n'<<24))

(注意marshal写出时保持little-endian字节序,所以rn就跑到后面去了。)

据说在magic里包含这样的数据是因为rn是换行符,如果.pyc文件被以文本模式打开并编辑,magic就会乱掉,那么Python解释器在试图加载这个损坏了的.pyc文件时就会发现有问题。

可是那个62161是怎么来的?通过阅读Include/code.h的注释,可以观察到每个主要的Python发行版本都有一个特别的数字,版本间各不相同。

上一页  1 2 3 4  下一页

Tags:Python pyc 文件

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