2015-08-17 6 views
28

Я использую ipdb довольно часто, чтобы просто перейти к фрагменту кода . т. Е. Сложно написать реальный скрипт, который его использует. Вместо этого я пишу минимальный тестовый пример с насмешкой и прыгаю в него.Выход из Python Debugger ipdb

Образцовый для рабочего процесса:

def func(): 
    ... 
    import ipdb 
    ipdb.set_trace() 
    ... 

def test_case(): 
    ... 
    func() 
    ... 

Затем вызовите

py.test test_file.py -s -k test_case 

Теперь, как правило, я просто проверить одну переменную или два, а затем хотите бросить курить. Измените код и сделайте это снова.

Как уволить? В руководстве указано, что q завершает работу отладчика. Это не так (действительно). Вы должны бросить несколько раз, прежде чем отладчик действительно прекратит работу. Такое же поведение для Ctrl-C и Ctrl-D (с дополнительным расстройством, которое нажимает Ctrl-D несколько раз, в конце концов также покидает терминал).

Есть ли умный способ заставить бросить? Является ли этот рабочий процесс даже разумным? Каков стандартный способ сделать это?

+3

Я тоже получаю это сейчас. Это недавнее поведение. Он использовал ctrl-c только отлично, но теперь он просто не уйдет. даже выброс исключения не остановит его. – felix

+2

Ссылка на [GitHub issue] (https://github.com/gotcha/ipdb/issues/111) об этой проблеме. –

+0

Исходная проблема была решена в ipython 5.2, см. Ответ @ cheflo. Можете ли вы принять это как ответ, чтобы не путать других людей с предлагаемыми обходными решениями? – ffeast

ответ

33

я поставил следующий в моих .pdbrc

import os 

alias kk os.system('kill -9 %d' % os.getpid()) 

kk убивает отладчик и (процесс, запускающий отладчик).

+1

Это будет работать, но выглядит как обходное решение, а не решение проблемы. Вы пытались спросить разработчиков ipdb? BTW похож на аналогичную проблему http: // stackoverflow.com/questions/39090752/how-to-quit-ipdb-in-post-mortem-debugging – ffeast

+0

Да, я согласен, что это обход. Одной из недостатков этой совместной работы является то, что если вы вызываете отладчик с консоли ipython с '% debug' и используете мой макрос' kk', он не просто выйдет из отладчика, но и убьет консоль ipython. Он должен быть поднят вместе с разработчиками. – joachim

+0

Где находится .pdbrc файл? Вам нужно создать его, если он еще не существует? – RubberDuckRabbit

33

Следующие работал для меня:

import sys 
sys.exit() 

В новых версиях IPython, как упоминалось выше, и ниже, это не работает. В этом случае

import os 
os._exit(0) 

все равно должны сделать трюк.

+1

Это не работает для меня. Я просто получаю «*** SystemExit: -1» на консоли, и я все еще в ipdb. – velotron

+12

'os._exit (0)' работал для меня. – akki

+0

Спасибо os.exit (0) –

7

Это проблема с последней версией IPython 5.1.0. Вы можете проверить с вашей среде, используя следующий код:

pip freeze | egrep -i '^i' 

Он будет решен понижен до IPython == 5.0.0.

pip install ipython==5.0.0 

Это работает для меня.

4

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

+0

Просто протестировал его, и он отлично работает для меня. Я думаю, что это должен быть принятый ответ, так как начиная с ipython 5.2, предлагаемые обходные пути не имеют смысла – ffeast

+1

Нет. Это не работает, если вы находитесь в цикле. –

+0

@ DarkStar1 Это работает для меня в цикле, можете ли вы опубликовать образец того, что не работает? –

Смежные вопросы