Python 2.6.2的.pyc文件格式
2010-09-22 11:25:54 来源:WEB开发网核心提示: 于是pyc_magic的作用有三: 1、拒绝完全不可能是正常的.pyc的文件,例如普通文本,Python 2.6.2的.pyc文件格式(3),图片、音乐,或者别的二进制格式,有兴趣的同学可以看看~ 实际解读一个.pyc文件的字节码 例如这样的一个Python源码:(随手写的,别介意内容)
于是pyc_magic的作用有三:
1、拒绝完全不可能是正常的.pyc的文件,例如普通文本,图片、音乐,或者别的二进制格式。检查文件的头4个字节已经能有效的筛掉许多无效文件。
2、拒绝不慎被文本编辑器编辑而破损的文件。
3、拒绝不对应的Python解释器生成的.pyc文件。由于不同Python版本的marshal算法可能不同,虚拟机采用的字节码指令集也可能不同,所以保守起见不同版本的Python解释器生成的.pyc文件被认为是不兼容的。
关于mtime
PyCodeObject被序列化为.pyc文件时,会连带对应源文件的修改时间一起记录下来。如果对应的源文件发生了修改,则其mtime会发生变化,以前生成的.pyc文件中的mtime就与源文件新的mtime不一致了。这样Python解释器就能够发现源文件有更新,并为其重新生成.pyc文件。
Python解释器生成.pyc文件一般是靠import机制来激活的,阅读Python/import.c可以看到import时对pyc_magic和mtime的检查和写入。
昨晚做了份Python 2.6.2的字节码指令集一览,有兴趣的同学可以看看~
实际解读一个.pyc文件的字节码
例如这样的一个Python源码:(随手写的,别介意内容)
demo.py
Python代码
class A():
x = 1
print(A.x) # 1
# increment A.x by 2
A.x += 2
print(A.x) # 3
# create an instance of A
a = A()
print(a.x) # 3
# increment A.x by 4
a.x += 4
print(a.x) # 7
print(A.x) # 3
让Python解释器将其编译为demo.pyc。只要随便在别的Python程序里import demo就足以得到这个文件了。文件内容是:
Hex代码
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 D1 F2 0D 0A B3 34 04 4A 63 00 00 00 00 00 00 00 羊..?.Jc.......
00000010 00 03 00 00 00 40 00 00 00 73 66 00 00 00 64 00 .....@...sf...d.
00000020 00 64 05 00 64 01 00 84 00 00 83 00 00 59 5A 00 .d..d..?.?.YZ.
00000030 00 65 00 00 69 01 00 47 48 65 00 00 04 69 01 00 .e..i..GHe...i..
00000040 64 02 00 37 02 5F 01 00 65 00 00 69 01 00 47 48 d..7._..e..i..GH
00000050 65 00 00 83 00 00 5A 02 00 65 02 00 69 01 00 47 e..?.Z..e..i..G
00000060 48 65 02 00 04 69 01 00 64 03 00 37 02 5F 01 00 He...i..d..7._..
00000070 65 02 00 69 01 00 47 48 65 00 00 69 01 00 47 48 e..i..GHe..i..GH
00000080 64 04 00 53 28 06 00 00 00 74 01 00 00 00 41 63 d..S(....t....Ac
00000090 00 00 00 00 00 00 00 00 01 00 00 00 42 00 00 00 ............B...
000000A0 73 0E 00 00 00 65 00 00 5A 01 00 64 00 00 5A 02 s....e..Z..d..Z.
000000B0 00 52 53 28 01 00 00 00 69 01 00 00 00 28 03 00 .RS(....i....(..
000000C0 00 00 74 08 00 00 00 5F 5F 6E 61 6D 65 5F 5F 74 ..t....__name__t
000000D0 0A 00 00 00 5F 5F 6D 6F 64 75 6C 65 5F 5F 74 01 ....__module__t.
000000E0 00 00 00 78 28 00 00 00 00 28 00 00 00 00 28 00 ...x(....(....(.
000000F0 00 00 00 73 07 00 00 00 64 65 6D 6F 2E 70 79 52 ...s....demo.pyR
00000100 00 00 00 00 01 00 00 00 73 02 00 00 00 06 01 69 ........s......i
00000110 02 00 00 00 69 04 00 00 00 4E 28 00 00 00 00 28 ....i....N(....(
00000120 03 00 00 00 52 00 00 00 00 52 03 00 00 00 74 01 ....R....R....t.
00000130 00 00 00 61 28 00 00 00 00 28 00 00 00 00 28 00 ...a(....(....(.
00000140 00 00 00 73 07 00 00 00 64 65 6D 6F 2E 70 79 74 ...s....demo.pyt
00000150 08 00 00 00 3C 6D 6F 64 75 6C 65 3E 01 00 00 00 ....<module>....
00000160 73 10 00 00 00 13 03 08 03 0F 01 08 03 09 01 08 s...............
00000170 03 0F 01 08 01 .....
[]
- ››python操作sharepoint对象模型
- ››Python 2.6.2的.pyc文件格式
- ››Python 2.6.2的字节码指令集一览
- ››Python 测试框架: 用 Python 测试框架简化测试
- ››Python 测试框架: 寻找要测试的模块
- ››Python的class系统
- ››Python 和 LDAP
- ››python图形处理库PIL(Python Image Library)
- ››Python图形图像处理库的介绍之Image模块
- ››Python和Google AppEngine开发基于Google架构的应...
- ››Python 3 初探,第 1 部分: Python 3 的新特性
- ››python源码中中文注释的处理
更多精彩
赞助商链接