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
codemáspdbya que este último parece expandirse sobre el primero?code?sys.exc_infopara extraer el rastreo y finalmente llamepdb.post_mortemcon 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 continuebandera, 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-catchIMO fea.pudbsobrepdb. 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
%debugpermite abrir el depurador después de encontrar un error. A menudo prefiero esto sobre%pdb. (La disyuntiva no es más que escribiendoqcada vez que no desea depurar un error de escritura vs.%debugcada vez que lo hace quiere depurar un error.)c.InteractiveShell.pdb = Trueen uno seipython_config.pyactiva%pdbautomá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%pdbfuente
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
upy losdowncomandos 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
pdbcuando se produce una excepción, haga esto:(o extienda su
PYTHONPATH). SePYTHONPATHnecesita para que el módulo se encuentre en la ruta, ya que está ejecutando elpdbmó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