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)
但是,不 - 我不知道有任何更直接的方法来获取模块并获取源代码.