Depuración interactiva inducida por punto de interrupción de Python con IPython
debugging breakpoints (5)
Dentro de la shell IPython, puedes hacer
from IPython.core.debugger import Pdb
pdb = Pdb()
pdb.runcall(my_function)
por ejemplo, o haga el pdb.set_trace()
normal dentro de su función.
Digamos que tengo una sesión de IPython, desde la que llamo a un script:
> run my_script.py
¿Hay alguna manera de inducir un punto de interrupción en my_script.py
desde el cual pueda inspeccionar mi área de trabajo desde IPython?
Recuerdo haber leído que en versiones anteriores de IPython se podía hacer:
from IPython.Debugger import Tracer;
def my_function():
x = 5
Tracer()
print 5;
pero el submódulo Debugger
ya no parece estar disponible.
Suponiendo que ya tengo abierta una sesión de IPython: ¿cómo puedo detener mi programa en una ubicación de mi elección e inspeccionar mi espacio de trabajo con IPython ?
En general, preferiría soluciones que no requieran que yo especifique previamente los números de línea, ya que me gustaría posiblemente tener más de una de esas llamadas a Tracer()
arriba y no tener que hacer un seguimiento de los números de línea donde están.
El Tracer()
todavía existe en ipython en un módulo diferente. Puedes hacer lo siguiente:
from IPython.core.debugger import Tracer
def my_function():
x = 5
Tracer()()
print 5
Tenga en cuenta los paréntesis de llamada adicionales alrededor de Tracer
edición : Tracer
está en desuso , debería usar set_trace()
lugar
Esta es la versión que usa el método set_trace()
lugar del Tracer()
obsoleto.
from IPython.core.debugger import Pdb
def my_function():
x = 5
Pdb().set_trace()
print 5
Puede ejecutarlo y establecer un punto de interrupción en una línea determinada con:
run -d -b12 myscript
Donde -b12 establece un punto de interrupción en la línea 12. Cuando ingresa esta línea, inmediatamente pasará a pdb y deberá ingresar c
para ejecutar hasta ese punto de interrupción.
Siempre he tenido la misma pregunta y la mejor solución que he encontrado que es bastante complicada es agregar una línea que rompa mi código, así:
...
a = 1+2
STOP
...
Luego, cuando ejecute ese código, se romperá y puedo hacer% de depuración para ir allí e inspeccionar. También puede activar% pdb para ir siempre al punto donde se rompe su código, pero esto puede ser molesto si no quiere inspeccionar en todas partes y cada vez que se rompe su código. Me encantaría una solución más elegante.