2011-10-06 15 views
21

A menudo tengo el caso de que escribiré un script, y estoy preparado para una parte del script donde quiero jugar con algunas de las variables de forma interactiva. Llegar a esa parte requiere ejecutar una gran parte del guión que ya he escrito.python: ejecute el shell de python interactivo desde el programa

En este caso, no es trivial ejecutar este programa desde dentro del shell. Tendría que recrear las condiciones de esa función de alguna manera.

Lo que quiero hacer es llamar a una función, como runshell(), que ejecutará el shell python en ese punto del programa, manteniendo todas las variables en el alcance, lo que me permite hurgar en él.

¿Cómo podría hacer eso?

+0

¿Está hablando de usar el depurador Python? ¿O está buscando consejos de diseño sobre cómo descomponer una secuencia de comandos grande en piezas más manejables? –

+0

pregunto por lo primero: ¡había olvidado esa palabra ('depurador')! – Claudiu

+0

posible duplicado de [¿Saltar a un programa intermedio de la sesión interactiva Python?] (Http://stackoverflow.com/questions/925832/jump-into-a-python-interactive-session-mid-program) –

Respuesta

37
import code 

code.interact(local=locals()) 

Pero utilizando el depurador de Python es probablemente más lo que quiere:

import pdb 

pdb.set_trace() 
+0

gracias! ¡Estoy buscando esto por un tiempo! importe el código – zx1986

+0

Si se encuentra en un punto de interrupción en una sesión de PDB, y desea descender a un shell interactivo de Python desde allí, el 'código de importación; code.interact (local = locals()) 'cosa es perfecta para eso.Las variables y funciones definidas en ese shell interactivo están entonces disponibles cuando presiona^D y regresa a la sesión de depuración. Muchas gracias, Michael Hoffman. –

5

Puede utilizar el depurador de Python (pdb) set_trace función.

Por ejemplo, si se invoca un script como el siguiente:

def whatever(): 
    x = 3 
    import pdb 
    pdb.set_trace() 

if __name__ == '__main__': 
    whatever() 

Usted consigue el alcance en el momento en set_trace se llama:

$ python ~/test/test.py 
--Return-- 
> /home/jterrace/test/test.py(52)whatever()->None 
-> pdb.set_trace() 
(Pdb) x 
3 
(Pdb) 
4

Por razones prácticas me gustaría añadir que se puede poner la traza depurador en un chiste:

import pdb; pdb.set_trace() 

que es una línea agradable para añadir a un editor que soporta fragmentos, como TextMate o Vim + SnipMate. Lo tengo configurado para expandir "break" en el trazador de líneas anterior.

+0

sí, de hecho, es lo que termino haciendo hoy en día – Claudiu

12

Con mucho, el método más conveniente que he encontrado es:

import IPython 
IPython.embed() 

Usted obtiene todas las variables globales y locales y todas las comodidades de IPython: finalización de pestaña, sangría automática, etc.

Tiene que instalar el módulo IPython para usarlo por supuesto:

pip install ipython 
+0

Me encanta esto con una advertencia. Tengo que rehacer mis importaciones. ¿Hay alguna forma de pasar las importaciones al nuevo shell interactivo también? – kdauria

Cuestiones relacionadas