Esta es una pregunta que me he preguntado durante bastante tiempo, pero nunca he encontrado una solución adecuada. Si ejecuto un script y me encuentro, digamos un IndexError, python imprime la línea, la ubicación y la descripción rápida del error y las salidas. ¿Es posible iniciar pdb automáticamente cuando se encuentra un error? No estoy en contra de tener una declaración de importación adicional en la parte superior del archivo, ni algunas líneas de código adicionales.
216
Respuestas:
Puede usar traceback.print_exc para imprimir las excepciones traceback. Luego use sys.exc_info para extraer el rastreo y finalmente llame a pdb.post_mortem con ese rastreo
Si desea iniciar una línea de comando interactiva con code.interact usando los locales del marco donde se originó la excepción, puede hacerlo
fuente
code
máspdb
ya que este último parece expandirse sobre el primero?code
?sys.exc_info
para extraer el rastreo y finalmente llamepdb.post_mortem
con ese rastreo . No necesita pasar el objeto de rastreo apdb.post_mortem
. Desde documentos : si no se proporciona un rastreo, se usa uno de la excepción que se está manejando actualmente (se debe manejar una excepción si se va a usar el valor predeterminado).Si no proporciona la
-c continue
bandera, deberá ingresar 'c' (para Continuar) cuando comience la ejecución. Luego se ejecutará hasta el punto de error y le dará el control allí. Como mencionó eqzx , este indicador es una nueva adición en python 3.2, por lo que se requiere ingresar 'c' para las versiones anteriores de Python (consulte https://docs.python.org/3/library/pdb.html ).fuente
gdb
; y cuando ingresa 'r'pdb
, el programa se ejecuta, pero NO se detiene (ni genera retroceso) por error; me dejó perplejo hasta que leí esto. ¡Salud!ipdb
; y, por supuesto, se pueden agregar argumentos después del guión!Use el siguiente módulo:
Póngale un nombre
debug
(o lo que quiera) y colóquelo en algún lugar de su ruta de Python.Ahora, al comienzo de su script, simplemente agregue un
import debug
.fuente
try-catch
IMO fea.pudb
sobrepdb
. Sigue volviendo a copiar y pegar, que seguramente dice algo sobre la falta de orden en mi vida.Ipython tiene un comando para alternar este comportamiento: % pdb . Hace exactamente lo que describió, tal vez incluso un poco más (ofreciéndole retrocesos más informativos con resaltado de sintaxis y finalización de código). Definitivamente vale la pena intentarlo!
fuente
%debug
permite abrir el depurador después de encontrar un error. A menudo prefiero esto sobre%pdb
. (La disyuntiva no es más que escribiendoq
cada vez que no desea depurar un error de escritura vs.%debug
cada vez que lo hace quiere depurar un error.)c.InteractiveShell.pdb = True
en uno seipython_config.py
activa%pdb
automáticamente para cada sesión.Este no es el depurador, pero probablemente igual de útil (?)
Sé que escuché a Guido mencionar esto en un discurso en alguna parte.
Acabo de comprobar python - ?, y si usas el comando -i puedes interactuar donde se detuvo tu script.
Entonces, dado este script:
¡Puedes obtener esta salida!
Para ser sincero, no he usado esto, pero debería serlo, parece muy útil.
fuente
IPython simplifica esto en la línea de comando:
puede reescribirse a
O, de manera similar, si se llama a un módulo:
puede reescribirse a
Tenga en cuenta que
--
para evitar que IPython lea los argumentos del script como propios.Esto también tiene la ventaja de invocar el depurador de IPython mejorado (ipdb) en lugar de pdb.
fuente
Si está utilizando
ipython
, después de iniciar escriba%pdb
fuente
Si está utilizando el entorno IPython, puede usar el% debug y el shell lo llevará de regreso a la línea ofensiva con el entorno ipdb para inspecciones, etc. Otra opción como se indicó anteriormente es usar el iPython magic% pdb que efectivamente lo hace lo mismo.
fuente
up
y losdown
comandos para volver a la línea de su código que generó el error.Puedes poner esta línea en tu código:
Más información: Inicie el depurador de python en cualquier línea
fuente
Para que se ejecute sin tener que escribir c al principio, use:
Pdb tiene sus propios argumentos de línea de comando: -cc ejecutará el comando c (en curso) al inicio de la ejecución y el programa se ejecutará sin interrupciones hasta el error.
fuente
python -m pdb script.py en python2.7 presione continuar para comenzar y se ejecutará el error y se romperá allí para la depuración.
fuente
Si está ejecutando un módulo:
Y ahora desea ingresar
pdb
cuando se produce una excepción, haga esto:(o extienda su
PYTHONPATH
). SePYTHONPATH
necesita para que el módulo se encuentre en la ruta, ya que está ejecutando elpdb
módulo ahora.fuente
Coloque un punto de interrupción dentro del constructor de la clase de excepción más alta en la jerarquía, y la mayoría de las veces verá dónde se generó el error.
Poner un punto de interrupción significa lo que quieras que signifique: puedes usar un IDE, o
pdb.set_trace
, o lo que seafuente