¿Hay alguna manera de iniciar un shell o indicador de IPython cuando mi programa ejecuta una línea que genera una excepción?Lanzar un shell IPython en la excepción
Estoy interesado principalmente en el contexto, las variables, en el alcance (y subámbitos) donde se produjo la excepción. Algo así como la depuración de Visual Studio, cuando se produce una excepción pero nadie la detecta, Visual Studio se detendrá y me dará la pila de llamadas y las variables presentes en cada nivel.
¿Crees que hay una forma de obtener algo similar usando IPython?
EDIT: La opción -pdb
cuando no parece lanzar IPython hacer lo que yo quiero (o tal vez no sé cómo usarlo correctamente, lo que es muy posible). Puedo ejecutar el siguiente script:
def func():
z = 2
g = 'b'
raise NameError("This error will not be caught, but IPython still"
"won't summon pdb, and I won't be able to consult"
"the z or g variables.")
x = 1
y = 'a'
func()
Uso del mando:
ipython -pdb exceptionTest.py
que se detiene la ejecución cuando se eleva el error, pero me lleva un símbolo IPython donde tengo acceso a las variables globales del guión , pero no las variables locales de función func. pdb
solo se invoca cuando escribo directamente un comando en ipython que causa un error, es decir, raise NameError("This, sent from the IPython prompt, will trigger pdb.")
.
No necesariamente necesito usar pdb
, solo me gustaría tener acceso a las variables dentro de func
.
EDIT 2: Ha pasado un tiempo, la opción -pdb
de IPython funciona ahora como yo quiero. Eso significa que cuando presento una excepción, puedo regresar al alcance de func
y leer sus variables z
y g
sin ningún problema. Incluso sin configurar la opción -pdb
, se puede ejecutar IPython en modo interactivo y luego llamar a la función mágica %debug
después de que el programa haya salido con error, que también lo llevará a un indicador interactivo de ipdb con todos los ámbitos accesibles.
al hacer este tipo de cortes, tenga en cuenta que la secuencia de comandos se puede bloquear lo llama si se trata de una parte de anoth er programa. Mi sugerencia es verificar si sys.stdin.isatty() antes de hacer eso. – d33tah