|
#! /usr/bin/env python |
|
|
|
import marshal |
|
import dis |
|
import types |
|
|
|
def dump(obj): |
|
print obj |
|
for attr in dir(obj): |
|
if attr.startswith('co_'): |
|
val = getattr(obj, attr) |
|
print "\t", attr, repr(val) |
|
|
|
def loadCode(path): |
|
f = open(path) |
|
f.read(8) |
|
co = marshal.load(f) |
|
f.close() |
|
return co |
|
|
|
def walk(co, match=None): |
|
if match is None or co.co_name == match: |
|
dump(co) |
|
print |
|
dis.dis(co) |
|
for obj in co.co_consts: |
|
if type(obj) == types.CodeType: |
|
walk(obj, match) |
|
|
|
def load(filename, codename=None): |
|
co = loadCode(filename) |
|
walk(co, codename) |
|
|
|
if __name__ == "__main__": |
|
import sys |
|
if len(sys.argv) == 3: |
|
filename, codename = sys.argv[1:] |
|
else: |
|
filename = sys.argv[1] |
|
codename = None |
|
if filename.endswith('.py'): |
|
buf = open(filename).read() |
|
co = compile(buf, filename, "exec") |
|
walk(co) |
|
else: |
|
load(filename, codename) |