Подтвердить что ты не робот

Как выйти из ipdb во время посмертной отладки?

Мне нравится проверять ошибку в Python script, используя:

$ python3 -m pdb my_script.py

Это отбрасывает меня в подсказку pdb, откуда я могу c продолжить выполнение, а когда он попадает в ошибку, я могу проверить переменные, а затем q завершить выполнение script, чтобы вернуться в свою оболочку.

Я пробовал то же самое с модулем отладчика iPython, так как он более яркий:

$ python3 -m ipdb my_script.py

Тем не менее, я не могу выйти из отладчика, как только закончу проверку ошибки. Использование команды q quit просто переключает ее между повторным выполнением режима script и 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

Как выйти из этого отладчика?

4b9b3361

Ответ 1

Это была ошибка в IPython 5.1. Это было исправлено в этом запросе на получение и больше не является проблемой с IPython 5.2 и выше. Теперь вы можете использовать q, quit() или Ctrl + d для выхода из отладчика.

Ответ 2

Как прокомментировал пользователь @ffeast, существует открытая проблема ipdb, и предлагается несколько обходных путей. Для меня это сработало хорошо:

  • нажмите ctrl + z и kill %1 (или любой другой номер задания)
  • выполнить ipdb> import os; os._exit(1) ipdb> import os; os._exit(1)

Ответ 3

Используйте ctrl + z или откройте второй терминал, затем найдите процесс (ps -ax | grep python) и ps -ax | grep python процесс.

Шаг за шагом:

  1. Получить доступ к терминалу:

    • Вариант A: Нажмите ctrl + z
    • Вариант Б: если у вас есть доступ к графическому интерфейсу Ubuntu, откройте второй терминал (ctrl + alt + t)
    • Вариант C: если у вас есть доступ только к командной строке, обратитесь ко второму tty (ctrl + alt + F2)
    • Вариант D: Если вы обращаетесь к серверу через ssh, создайте новое соединение с другого терминального ssh server (используйте опцию B или C, чтобы вы могли открыть второе соединение для выполнения команды)
  2. Ищите соответствующий PID Python процесса ps -ax | grep python ps -ax | grep python. Например, идентификатор процесса для моего процесса (python my_stucked_process.py) будет 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. Убить процесс kill -9 112923

@tutuDajuju предложил использовать ctrl + z, но их предложение только отправит процесс на задний план (он все еще будет существовать, потребляя память). Вы должны сделать выше, чтобы действительно убить процесс