丢失重要的.py文件(覆盖为0byte文件),但旧版本仍然加载在IPYTHON模块 – 可以检索?

由于我的愚蠢,在pipe理几个不同的屏幕会话,其中许多vim打开,在试图“组织”我的会话的过程中,我以某种方式设法覆盖一个0Byte文件非常重要的.py脚本。

然而,我有一个ipython实例打开,当运行相同的.py文件作为一个模块,仍然记得以前的代码在那里!

所以我刚刚学习了一个关于备份的重要课程(我最后一个是在一个星期前由vim完成的,这会让我有很多工作要做),或者是否有任何可能的,可以想象的方式来检索.py文件从一个已经加载的模块? 我可能因为这么傲慢而配得上这个,但是我在这里非常绝望。

如注释中所述, inspect.getsource将不起作用,因为它取决于原始文件(即, module.__file__文件module.__file__ )。

最佳选择:检查是否有.pyc文件(例如, foo.pyc应该在foo.py旁边)。 如果有的话,你可以使用反编译Python 2.7 .pyc来反编译它。

inspect模块也缓存来源。 你可能会很幸运,如果过去被调用过,可以使用inspect.getsource(module) ,或者inspect.getsourcelines(module.function)

否则,您将需要通过检查导出(即, module.__globals__ )来“手动”重建模块。 常量和不明显的东西,对于函数,你可以使用func.func_name获取它的名字, func.__doc__获取文档字符串, inspect.getargspec(func)获取参数, func.func_code获取代码的细节: co_firstlineno将获得行号,然后co_code将获得代码。 这里有更多反编译: 探索和反编译python字节码

例如,要使用uncompyle2

 >>> def foo(): ... print "Hello, world!" ... >>> from StringIO import StringIO >>> import uncompyle2 >>> out = StringIO() >>> uncompyle2.uncompyle("2.7", foo.func_code, out=out) >>> print out.getvalue() print 'Hello, world!' 

但是,不,我不知道有更直接的方法来取模块并取回源代码。

在该过程仍在运行的情况下,您可以查看您的名称空间以查找要恢复的候选人:

 >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'readline', 'rlcompleter', 'test'] 

让我们看看我们有什么test存储:

 >>> help(test) Help on module test: NAME test FILE /Users/tfisher/code/ffi4wd/test.py FUNCTIONS call_cat(cat) DATA cat_name = 'commander sprinkles' 

比在test看到当地人更清洁的输出:

 >>> dir(test) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'call_cat', 'cat_name', 'json'] 

使用inspect模块 ,我们可以得到函数的参数说明:

 >>> inspect.getargspec(test.call_cat) ArgSpec(args=['cat'], varargs=None, keywords=None, defaults=None) 

或我们的功能里面的线:

 >>> inspect.getsourcelines(test.call_cat) (['def call_cat(cat):\n', ' print("Hello %s" % cat)\n'], 5) 

这是相当接近原来的:

 import json cat_name = 'commander sprinkles' def call_cat(cat): print("Hello %s" % cat) 

如果文件在被导入后被删除,并且没有被相同名称的新文件替换(如果可能的话, getsourcelines使用对象缓存):

 $ python -V Python 2.7.10 $ ls | grep test $ 

你应该可以使用inspect

在您的Ipython会话中导入inspect ,假设您正在尝试恢复mymodulee ,请执行以下操作:

q = inspect.getsource(mymodulee)

并将q写入一个文件。

[编辑]这工作对我来说,模拟使用Python 2.7.6,IPython 1.2.1的问题

[编辑#2]

在这里输入图像描述