Iniciar el depurador de Python automáticamente en caso de error

Resuelto jeremy asked hace 16 años • 15 respuestas

Esta es una pregunta que me he planteado durante bastante tiempo, pero nunca he encontrado una solución adecuada. Si ejecuto un script y me encuentro con, digamos, un IndexError, Python imprime la línea, la ubicación y la descripción rápida del error y sale. ¿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.

jeremy avatar Oct 28 '08 14:10 jeremy
Aceptado
python -m pdb -c continue myscript.py
# or
python -m pdb -c continue -m myscript

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á control allí. Como lo menciona eqzx , este indicador es una nueva incorporación en Python 3.2, por lo que se requiere ingresar 'c' para versiones anteriores de Python (consulte https://docs.python.org/3/library/pdb.html ).

Catherine Devlin avatar Mar 13 '2010 15:03 Catherine Devlin

Puede utilizar traceback.print_exc para imprimir el rastreo de excepciones. Luego use sys.exc_info para extraer el rastreo y finalmente llame a pdb.post_mortem con ese rastreo

import pdb, traceback, sys

def bombs():
    a = []
    print a[0]

if __name__ == '__main__':
    try:
        bombs()
    except:
        extype, value, tb = sys.exc_info()
        traceback.print_exc()
        pdb.post_mortem(tb)

Si desea iniciar una línea de comando interactiva con code.interact utilizando los locales del marco donde se originó la excepción, puede hacerlo

import traceback, sys, code

def bombs():
    a = []
    print a[0]

if __name__ == '__main__':
    try:
        bombs()
    except:
        type, value, tb = sys.exc_info()
        traceback.print_exc()
        last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb
        frame = last_frame().tb_frame
        ns = dict(frame.f_globals)
        ns.update(frame.f_locals)
        code.interact(local=ns)
Florian Bösch avatar Oct 28 '2008 07:10 Florian Bösch

Utilice el siguiente módulo:

import sys

def info(type, value, tb):
    if hasattr(sys, 'ps1') or not sys.stderr.isatty():
    # we are in interactive mode or we don't have a tty-like
    # device, so we call the default hook
        sys.__excepthook__(type, value, tb)
    else:
        import traceback, pdb
        # we are NOT in interactive mode, print the exception...
        traceback.print_exception(type, value, tb)
        print
        # ...then start the debugger in post-mortem mode.
        # pdb.pm() # deprecated
        pdb.post_mortem(tb) # more "modern"

sys.excepthook = info

Nómbrelo debug(o como quiera) y colóquelo en algún lugar de su ruta de Python.

Ahora, al comienzo de su secuencia de comandos, simplemente agregue un archivo import debug.

tzot avatar Oct 28 '2008 08:10 tzot