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

Python 2.6.2的.pyc文件格式

 2010-09-22 11:25:54 来源:WEB开发网   
核心提示: 根据本文前半部分的分析,顶层代码的字节码长度是0x66=102字节,Python 2.6.2的.pyc文件格式(4),位于0x1E-0x83这个范围内,有兴趣的同学可以参考Python指令集列表来试试自行解读字节码指令,自己分析嫌麻烦的话让dis帮忙解决就行: (下面代码中,dis.dis

根据本文前半部分的分析,顶层代码的字节码长度是0x66=102字节,位于0x1E-0x83这个范围内。有兴趣的同学可以参考Python指令集列表来试试自行解读字节码指令。

看到字节码的开头,首先是0x64,这是一个LOAD_CONST指令,有参数,所以接着看后面两个字节,0x00 0x00,也就是参数为0(注意little-endian字节序)。LOAD_CONST 0,也就是把常量池下标为0的对象压到求值栈上。

接下来又是0x64,连上参数的0x05 0x00,就是LOAD_CONST 5,也就是把常量池下标为5的对象压到求值栈上。

后面的字节码也可依法类推辨认出来。

事实上Python标准库里已经有提取字节码的库,dis模块。自己分析嫌麻烦的话让dis帮忙解决就行:

(下面代码中,dis.dis(code)的结果就是顶层代码对象中的字节码,

格式:行号  偏移量 指令名 参数(括号内为参数的注解))

Python interactive代码   

E:Python26>python
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis, marshal
>>> f = open('demo.pyc', 'rb')
>>> magic = f.read(4)
>>> mtime = f.read(4)
>>> code = marshal.load(f)
>>> dis.dis(code)
  1           0 LOAD_CONST               0 ('A')
              3 LOAD_CONST               5 (())
              6 LOAD_CONST               1 (<code object A at 01707EC0, file "demo.py", line 1>)
              9 MAKE_FUNCTION            0
             12 CALL_FUNCTION            0
             15 BUILD_CLASS
             16 STORE_NAME               0 (A)

  4          19 LOAD_NAME                0 (A)
             22 LOAD_ATTR                1 (x)
             25 PRINT_ITEM
             26 PRINT_NEWLINE

  7          27 LOAD_NAME                0 (A)
             30 DUP_TOP
             31 LOAD_ATTR                1 (x)
             34 LOAD_CONST               2 (2)
             37 INPLACE_ADD
             38 ROT_TWO
             39 STORE_ATTR               1 (x)

  8          42 LOAD_NAME                0 (A)
             45 LOAD_ATTR                1 (x)
             48 PRINT_ITEM
             49 PRINT_NEWLINE

 11          50 LOAD_NAME                0 (A)
             53 CALL_FUNCTION            0
             56 STORE_NAME               2 (a)

 12          59 LOAD_NAME                2 (a)
             62 LOAD_ATTR                1 (x)
             65 PRINT_ITEM
             66 PRINT_NEWLINE

 15          67 LOAD_NAME                2 (a)
             70 DUP_TOP
             71 LOAD_ATTR                1 (x)
             74 LOAD_CONST               3 (4)
             77 INPLACE_ADD
             78 ROT_TWO
             79 STORE_ATTR               1 (x)

 16          82 LOAD_NAME                2 (a)
             85 LOAD_ATTR                1 (x)
             88 PRINT_ITEM
             89 PRINT_NEWLINE

 17          90 LOAD_NAME                0 (A)
             93 LOAD_ATTR                1 (x)
             96 PRINT_ITEM
             97 PRINT_NEWLINE
             98 LOAD_CONST               4 (None)
            101 RETURN_VALUE
>>> quit()

P.S. 其实这文单独看挺火星的……我是为了让另外一帖更干净些才把分析.pyc文件格式的部分拆了出来。

上一页  1 2 3 4 

Tags:Python pyc 文件

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