由于我的愚蠢,在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]