简书链接:http://www.jianshu.com/p/03d81eb9ac9b
这篇文章只是纯粹分析python pyc文件格式,主要是关于pyc在文件中的存储方式进行了解析。pyc是python字节码在文件中存储的方式,而在虚拟机运行时环境中对应PyCodeObject对象。关于PyFrameObject以及PyFunctionObject等运行时结构,后续希望学习透彻了能够一并分析。
1.示例文件
源文件test.py
s = "hello"
def func():
a = 3
print s
func()
通过执行python pyc_generator.py test
可以生成编译好的pyc文件。
##pyc_generator.py
import imp
import sys
def generate_pyc(name):
fp, pathname, description = imp.find_module(name)
try:
imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
if __name__ == "__main__":
generate_pyc(sys.argv[1])
得到test.pyc后,执行hexdump -C test.pyc
可以得到如下二进制字符流。
00000000 03 f3 0d 0a f6 e9 38 55 63 00 00 00 00 00 00 00 |......8Uc.......|
00000010 00 01 00 00 00 40 00 00 00 73 1a 00 00 00 64 00 |.....@...s....d.|
00000020 00 5a 00 00 64 01 00 84 00 00 5a 01 00 65 01 00 |.Z..d.....Z..e..|
00000030 83 00 00 01 64 02 00 53 28 03 00 00 00 74 05 00 |....d..S(....t