#! /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)