从Python解释器中恢复.pyc文件

4 投票
2 回答
2351 浏览
提问于 2025-04-18 15:04

因为我太笨了,删除了一些Python文件,还没备份。在删除之前,我打开了Python解释器(也就是运行了python),然后用命令import myfile.py导入了文件。

补充一下:其实我用的命令是import myfile,听说这样做更糟糕。

有没有办法从我现在打开的Python解释器会话中恢复这个.pyc文件(或者更好的是.py文件,但这看起来不太可能)?

2 个回答

1

inspect.getsource 这个功能可以用来查看模块的源代码,所以你可以简单地这样做:

import inspect
inspect.getsource(myfile)

不过如果这样不行的话,你至少可以用下面的方式获取到反汇编后的(".pyc")代码:

import dis
dis.dis(myfile)
4

这个字节码反编译工具 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)

撰写回答