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发行版本都有一个特别的数字,版本间各不相同。
更多精彩
赞助商链接