¿Cómo salir de ipdb en la depuración post-mortem?

Me gusta inspeccionar el error en un script de Python usando:

$ python3 -m pdb my_script.py 

Esto me deja en un indicador de pdb desde donde puedo continuar la ejecución, y cuando se produce un error, puedo inspeccionar las variables y luego salir de la ejecución del script para volver a mi shell.

Intenté lo mismo con el módulo de depuración iPython, ya que es más colorido:

 $ python3 -m ipdb my_script.py 

Sin embargo, no puedo salir del depurador una vez que termine de inspeccionar el error. El uso del comando q quit simplemente continúa cambiando entre la ejecución del script y el modo post-mortem:

 $ python3 -m ipdb my_script.py ipdb> c Uncaught exception. Entering post mortem debugging Running 'cont' or 'step' will restart the program ipdb> Inspect some variables at this point ipdb> q Post mortem debugger finished. The my_script.py will be restarted ipdb> q Uncaught exception. Entering post mortem debugging Running 'cont' or 'step' will restart the program ipdb> q Post mortem debugger finished. The my_script.py will be restarted ipdb> q Uncaught exception. Entering post mortem debugging Running 'cont' or 'step' will restart the program ipdb> q Post mortem debugger finished. The my_script.py will be restarted ipdb> q Uncaught exception. Entering post mortem debugging Running 'cont' or 'step' will restart the program 

¿Cómo salir de este depurador?

Esto fue un error en IPython 5.1. Se solucionó en esta solicitud de extracción y ya no es un problema de IPython 5.2 y posteriores. Ahora puede usar q , quit() o Ctrl + d para salir del depurador.

Como comentó el usuario @ffeast, hay un problema de ipdb abierto y se sugieren algunas soluciones. Para mi estos funcionaron bien:

  • presione ctrl + z y kill %1 (o cualquiera que sea el número de trabajo)
  • ejecuta ipdb> import os; os._exit(1) ipdb> import os; os._exit(1)

Use ctrl + z (o una segunda terminal) y finalice el proceso .

  1. Abre una segunda terminal:

    • Opcion A : Presiona ctrl + z
    • Opción B : Si tiene acceso a la GUI de Ubuntu , abra una segunda terminal ( ctrl + alt + t )
    • Opción C : si solo tiene acceso a una línea de comando , acceda a un segundo tty ( ctrl + alt + F2 )
    • Opción D : Si está accediendo a un servidor a través de ssh , haga una nueva conexión desde otro ssh server terminal (use la opción B o C, para que pueda abrir una segunda conexión para ejecutar el comando)

: ( si ctrl + z no funciona , puede abrir un segundo terminal)

  1. Busque el PID de python correspondiente del proceso ps -ax | grep python ps -ax | grep python . Por ejemplo, la identificación del proceso para mi proceso ( python my_stucked_process.py ) sería 112923 :
  3085 tty1 Sl+ 15:53 /usr/bin/python /usr/bin/x-terminal-emulator 112923 pts/2 Tl 0:01 python my_stucked_process.py 113118 pts/2 S+ 0:00 grep --color=auto python 
  1. Matar el proceso de kill -9 112923

@tutuDajuju sugirió usar ctrl + z, pero su sugerencia solo enviará el proceso a un segundo plano (seguirá existiendo y consumirá memoria). Necesitas hacer lo anterior para realmente matar el proceso.