2016-09-30 7 views
2

При отладке скриптов в Python (2.7, работает на Linux) я иногда вводят pdb.set_trace() (обратите внимание, что я на самом деле с помощью IPDB), например:как остановить программу питона после pdb.set_trace()

import ipdb as pdb 
try: 
    do_something() 
    # I'd like to look at some local variables before running do_something_dangerous() 
    pdb.set_trace() 
except: 
    pass 
do_something_dangerous() 

Обычно я запускаю свой скрипт из оболочки, например

python my_script.py 

Иногда во время моего сеанса отладки, я понимаю, что я не хочу, чтобы запустить do_something_dangerous(). Какой самый простой способ остановить выполнение программы, чтобы do_something_dangerous() не был запущен, и я могу вернуться в оболочку?

Как я понимаю, нажатие ctrl-d (или выдача команды отладки отладчика) просто выйдет из ipdb, и программа продолжит работу (в моем примере выше). Нажатие ctrl-c, похоже, вызывает KeyboardInterrupt, но я никогда не понимал контекста, в котором он был поднят.

Я надеюсь на что-то вроде ctrl-q, чтобы просто удалить весь процесс, но я ничего не смог найти.

Я понимаю, что мой пример очень надуман, но мой вопрос заключается в том, как прервать выполнение из pdb, когда отлаживаемый код настроен на обнаружение исключений. Речь идет не о том, как перестроить приведенный выше код, чтобы он работал!

ответ

0

От module docs:

д (ПИФ) Выход из отладчика. Выполняемая программа прерывается.

В частности, это приведет к тому, что следующая функция отладчика, вызываемая для вызова исключения BdbQuit.

+0

Я думаю, что ctrl-d и q (uit) совпадают, и мой код настроен на обнаружение исключений, поэтому это не завершает мою программу. Я буду обновлять свой пример, потому что это было не совсем понятно! – nonagon

1

Я обнаружил, что ctrl-z приостанавливает процесс python/ipdb, а затем «kill% 1», чтобы завершить процесс, работает хорошо и для меня достаточно быстро ввести (с псевдонимом bash k = 'kill% 1 «). Я не уверен, есть ли что-нибудь более чистое и простое.

+0

Фактически псевдоним k = 'kill %%; wait %% 2>/dev/null 'был немного лучше для моих целей (он подавляет сообщения [1] + и работает, если вокруг есть другие задания) – nonagon