字节码反编译器
uncompyle2可以将Python 2.x的类、方法、函数和代码反编译为源代码(注意:通过
重新组装Python字节码到原始代码?)。
这对于函数来说已经足够好了:
from StringIO import StringIO
from uncompyle2 import uncompyle
from inspect import *
def decompile_function(f, indent=''):
s = StringIO()
uncompyle(2.7, f.func_code, s)
return '%sdef %s%s:\n%s %s' % (
indent,
f.func_name,
inspect.formatargspec(*inspect.getargspec(f)),
indent,
('\n ' + indent).join(''.join(s.buflist).split('\n')))
不幸的是,因为类已经执行,它将无法恢复它们的结构;您需要逐个反编译方法,并希望这足够:
def decompile_class(c):
return 'class %s(%s):\n' % (
c.__name__,
','.join(b.__module__ + '.' + b.__name__ for b in c.__bases__)) + \
'\n'.join(decompile_function(m.im_func, ' ')
for n, m in inspect.getmembers(c) if inspect.ismethod(m))
完整解决方案:
def decompile_module(mod):
return '\n\n'.join(decompile_function(m) if isfunction(m) else
decompile_class(m) if isclass(m) else
'# UNKNOWN: ' + repr((n, m))
for n, m in inspect.getmembers(mod) if inspect.getmodule(m) is mod)
.py
文件已经被加载,即使您不喜欢该文件,它也将可用,但是如果只加载了.pyc
,则.py
文件可能永远消失。因此,您需要一种方法来转储.pyc
。如果我没记错的话,这在最近的Python中并不简单,但是在旧版本中需要大量的hackery,所以...您使用的是哪个版本? - abarnert