concha de python: encurtido en todo el estado

Al usar ” ipython ” o ” code.interact(local=locals()) “, me gustaría tener una forma de guardar todo el espacio de direcciones del progtwig en un archivo pickle, y de manera similar una forma de cargar dicho archivo y entonces comience a ejecutar en ese contexto.

Esto debería ser totalmente posible para scripts simples debido a la memoria virtual.

Todos los nombres definidos (y los objetos no huérfanos a los que apuntan), desde locales hasta globales y funciones globales, serían decapados. Al deshacerse de ellos, esos nombres serían asignados nuevamente, en su scope original.

Supongamos que el progtwig no utiliza la red, por lo que se evita la discontinuidad del estado.

Supongamos que el progtwig es tolerante a fallos en lo que respecta a la percepción de descontento del reloj del sistema, por lo que tampoco hay problema.

El único desafío parece ser qué hacer con los descriptores de archivos. Idealmente, si esto no existe ya, debería haber una función simple “pickle descriptor de archivo” que obtenga los bits de modo con los que está abierto, y la posición del cursor del archivo, y una sum de comprobación del contenido del archivo (error si el las sums de comprobación no coinciden cuando se intenta deseleccionar).

¿Hay algunas líneas que lograrán este “decapado de toda la sesión”?

Para hacer esto, usaría dill , que puede serializar casi cualquier cosa en python.

 >>> import dill >>> >>> def foo(a): ... def bar(x): ... return a*x ... return bar ... >>> class baz(object): ... def __call__(self, a,x): ... return foo(a)(x) ... >>> b = baz() >>> b(3,2) 6 >>> c = baz.__call__ >>> c(b,3,2) 6 >>> g = dill.loads(dill.dumps(globals())) >>> g {'dill': , 'c': , 'b': <__main__.baz object at 0x4d61970>, 'g': {...}, '__builtins__': , 'baz': , '_version': '2', '__package__': None, '__name__': '__main__', 'foo': , '__doc__': None} 

Dill registra sus tipos en el registro de pickle , por lo que si tiene algún código de recuadro negro que utiliza pickle y no puede editarlo, la importación de eneldo mágicamente puede hacer que funcione sin tener que hacer el mono con el código de terceros.

También querías que todo el período de sesiones de intérprete fuera más delicado … dill también puede hacerlo.

 >>> # continuing from above >>> dill.dump_session('foobar.pkl') >>> >>> ^D dude@sakurai>$ python Python 2.7.5 (default, Sep 30 2013, 20:15:49) [GCC 4.2.1 (Apple Inc. build 5566)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import dill >>> dill.load_session('foobar.pkl') >>> c(b,3,2) 6 

Dill también tiene algunas buenas herramientas para ayudarlo a comprender qué está causando que su decapado falle cuando falla su código.