Iniciar el depurador de Python automáticamente en caso de error
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.
python -m pdb -c continue myscript.py
# or
python -m pdb -c continue -m myscript
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á 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 ).
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)
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
.