una txt por modificar lista linea leer importar guardar gestion fichero escribir datos binarios archivos archivo python linux vim ipython recovery

txt - Se perdió el archivo.py importante(se sobrescribió como archivo de 0 bytes), pero la versión anterior aún está CARGADA EN IPYTHON como módulo, ¿se puede recuperar?



python escribir lista en fichero (3)

Debido a mi estupidez, al administrar varias sesiones de pantalla diferentes con vim abierto en muchas de ellas, en el proceso de intentar "organizar" mis sesiones, de alguna manera logré sobrescribir un script .py muy importante con un archivo de 0 bytes.

SIN EMBARGO, tengo una instancia de ipython abierta que, al ejecutar el mismo archivo .py como módulo, ¡todavía recuerda el código que solía estar allí!

Entonces, acabo de aprender una dura lección acerca de las copias de seguridad (mi última la hizo vim hace una semana, lo que me dejaría mucho trabajo por hacer), o existe alguna forma posible de recuperar el archivo .py. ¿De un módulo ya cargado? Probablemente merezco esto por ser tan arrogante, pero estoy muy desesperado aquí.


Como se señaló en los comentarios, inspect.getsource no funcionará porque depende del archivo original (es decir, module.__file__ ).

La mejor opción: verifique si hay un archivo foo.pyc (por ejemplo, foo.pyc debería estar al lado de foo.py ). Si lo hay, puedes usar Decompile Python 2.7 .pyc para descompilarlo.

Los módulos de inspect también almacenan en caché la fuente. Puede tener suerte y usar inspect.getsource(module) , o inspect.getsourcelines(module.function) si se ha llamado en el pasado.

De lo contrario, deberá reconstruir el módulo "manualmente" inspeccionando las exportaciones (es decir, el module.__globals__ ). Las constantes y otras cosas son obvias, y para las funciones puede usar func.func_name para obtener su nombre, func.__doc__ para obtener la cadena de documentos, inspect.getargspec(func) para obtener los argumentos y func.func_code para obtener detalles sobre el código: co_firstlineno obtendrá el número de línea, luego co_code obtendrá el código. Aquí encontrará más información sobre la descompilación: exploración y descompilación del código de bytes de Python

Por ejemplo, para usar 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!''

Pero no, no conozco ningún método más directo para tomar un módulo y recuperar el código fuente.


Con el proceso aún en ejecución, puede buscar en su espacio de nombres para encontrar candidatos para restaurar:

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

Echemos un vistazo a lo que tenemos en la tienda para la 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''

Que tiene una salida más limpia que mirar a los locales dentro de la test :

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

Usando el módulo de inspección , podemos obtener las especificaciones de argumentos para las funciones:

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

o las líneas dentro de nuestras funciones:

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

Que está razonablemente cerca del original:

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

Lo que debería funcionar si el archivo se elimina después de ser importado y no ha sido reemplazado por un archivo con el mismo nombre que es más nuevo ( getsourcelines usa el caché de objetos si es posible):

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


Debes poder utilizar inspect

inspect importación en su sesión de Ipython y, suponiendo que está intentando recuperar myModule , haga lo siguiente:

q = inspect.getsource(myModule)

y escribe q en un archivo.

[Editar] Esto me funcionó simulando el problema usando Python 2.7.6, IPython 1.2.1

[Editar # 2]