0%

查看Python字节码

有时候我们想看一下Python翻译出来的字节码是怎样的,此时我们可以借助dis模块。

我们在交互式环境iPython下,可以动态地获取我们刚刚创建的函数的字节码。

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [1]: import dis

In [2]: def say_hello():
...: print 'Hello, ET'
...:

In [3]: dis.dis(say_hello)
2 0 LOAD_CONST 1 ('Hello, ET')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE

In [4]: say_hello()
Hello, ET

而对于文件的字节码,我们可以先读取然后编译。

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

In [2]: s = open('test.py').read()

In [3]: co = compile(s, 'file test.py', 'exec')

In [4]: dis.dis(co)
1 0 LOAD_CONST 0 (code object say_hello at 0x29a2bb0,
file "file test.py", line 1)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (say_hello)

4 9 LOAD_NAME 0 (say_hello)
12 CALL_FUNCTION 0
15 POP_TOP
16 LOAD_CONST 1 (None)
19 RETURN_VALUE


其中,dis的输出为:

1
2
行号            字节码偏移量     字节码指令        指令参数          对于参数的相关说明
1 0 LOAD_CONST 1 ('Hello, ET')

对于dis模块的介绍,我们可以围观 http://docs.python.org/library/dis.html

字节码的定义在opcode.h中。

参考:

  1. 《Python源码剖析》