| #! /usr/bin/env python |
| |
| import marshal |
| import os |
| 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) |