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

Luk*_*vis 21 python linux vim recovery ipython

由于我的愚蠢,在管理几个不同的屏幕会话时,其中很多人都打开了vim,在尝试"组织"我的会话的过程中,我以某种方式设法用0Byte文件覆盖了一个非常重要的.py脚本.

但是,我打开了一个ipython实例,当运行与模块相同的.py文件时,仍会记住以前的代码!

所以我刚刚学到了关于备份的一个艰难的教训(我的最后一个是关于一周前由vim完成的,这将让我有很多工作要做),或者是否有任何可能的,可想到的方法来检索.py文件从已装载的模块?我可能应该得到这样的骑士,但我在这里非常绝望.

Dav*_*ver 23

如评论中所述,inspect.getsource将无法工作,因为它取决于原始文件(即module.__file__).

最佳选择:检查是否有.pyc文件(例如,foo.pyc旁边应该是foo.py).如果有,您可以使用Decompile 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!'
Run Code Online (Sandbox Code Playgroud)

但是,不 - 我不知道有任何更直接的方法来获取模块并获取源代码.

  • pfft,但如果人们去做那些愚蠢的事情,我怎么能得到所有这些甜蜜的互联网点? (10认同)
  • 你省略了最后两步:开始使用源代码控制,再也不会容易受到这个错误的影响! (8认同)