Как правильно отлаживать блокнот iPython?


121

Насколько я знаю, %debug magicотладку можно делать в пределах одной ячейки.

Однако у меня есть вызовы функций в нескольких ячейках.

Например,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

Что пробовал:

  1. Я пробовал установить %debugв первой строке ячейки-1. Но он сразу переходит в режим отладки, даже до выполнения ячейки-2.

  2. Я пытался добавить %debugстроку прямо перед кодом return do_some_thing_about(b). Но тогда код работает вечно, никогда не останавливается.

Как правильно установить точку останова в ноутбуке ipython?

Ответы:


73

Используйте ipdb

Установите его через

pip install ipdb

Использование:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

Для выполнения построчно nи для перехода в функцию используйте sи для выхода из отладочной подсказки c.

Полный список доступных команд: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdb не дает мне приглашения отладки в другой ячейке с примером кода, упомянутым в вопросе. Теперь код работает вечно.
Rex

@Rex У меня работает. Куда ты ipdb поставил? Ставим import ipdb; ipdb.set_trace (); перед строкой return do_some_thing_about (b). Затем вызовите fun1 (a) из второй ячейки, он должен работать. Для выхода из окна отладки используйте 'c'
Тевин Джозеф К.О.

@Rex Обновил ответ для большей ясности.
Тевин Джозеф КО

29
Это работает в консоли iPython, но не в записной книжке iPython (о чем и задан вопрос). Когда я печатаю import ipdb; ipdb.set_trace()в ячейке записной книжки, там написаноMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Билл

1
новинка для jupyter ... кажется, что он больше подходит для презентации и совместного использования фрагментов кода ... можем ли мы иметь функции, которые IDE (например, eclipse, rstudio) предоставляют, такие как фактическая отладка, пошаговое выполнение, точки останова, добавление часов к выражению и переменные и т. д. Сначала кажется, что это не так, просто хочу быть уверенным ...
Mahesha999

90

Вы можете использовать ipdbвнутри jupyter с:

from IPython.core.debugger import Tracer; Tracer()()

Изменить : указанные выше функции устарели с IPython 5.1. Это новый подход:

from IPython.core.debugger import set_trace

Добавьте set_trace()туда, где вам нужна точка останова. Введите helpдля ipdbкоманд , когда появляется поле ввода.


20
Tracerбыл обесценен. Теперь это работает так: from IPython.core.debugger import set_traceи set_trace()вызывает точку останова. Источник: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Антон Тарасенко

1
Удобно использовать как одну строку, где бы это ни было:from IPython.core.debugger import set_trace;set_trace()
Нир

15

Ваша функция возврата находится в строке функции def (основная функция), вы должны указать ей одну вкладку. И использовать

%%debug 

вместо того

%debug 

для отладки всей ячейки, а не только строки. Надеюсь, может это тебе поможет.


12

Вы всегда можете добавить это в любую ячейку:

import pdb; pdb.set_trace()

и отладчик остановится на этой строке. Например:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)

Это должно быть ipdb?
Rex

1
@Rex Не обязательно. ipdbявляется рефакторингом Python Debugger, который более тесно интегрирован с IPython. pdbвстроен
Two-Bit Alchemist

ipdbтакже может использоваться вне оболочки ipython и имеет некоторые удобства, такие как завершение табуляции.
янв.,

12

В Python 3.7 вы можете использовать функцию breakpoint () . Просто введите

breakpoint()

где бы вы ни хотели остановить выполнение, вы можете использовать те же команды pdb (r, c, n, ...) или оценивать свои переменные.


2
Чтобы добавить к этому, когда вы вызываете точку останова (), вы можете ввести «help» в появившееся текстовое поле, чтобы получить список команд.
gbeaven

Похоже, что после использования breakpoint () или pdb постоянно возникает проблема зависания: github.com/ipython/ipython/issues/10516
Дэйв Лю

8

Просто введите import pdbjupyter notebook, а затем используйте эту шпаргалку для отладки. Это очень удобно.

c-> продолжить, s-> шаг, b 12-> установить точку останова на строке 12 и так далее.

Некоторые полезные ссылки: Официальный документ Python по pdb , примеры отладчика Python pdb для лучшего понимания того, как использовать команды отладчика .

Несколько полезных скриншотов: введите описание изображения здесьвведите описание изображения здесь


Хороший ответ. Однако я думаю (я новичок в Jupyter notebook) для установки точки останова следует добавить% debug.
Ad Infinitum

Что я делаю pdb.set_trace(), так b line_noэто копирую и вставляю туда, где я хочу установить точку останова, поскольку она не работает в Jupyter Notebook и хорошо работает на python IDLE.
flowera

Спасибо! Я также загрузил несколько скриншотов, которые протестировал сегодня. Если бы я мог переключиться на Python IDLE, я бы с удовольствием сделал это ..
flowera

Кроме того, я нахожу способ показать номер строки в блокноте jupyter, щелкнуть новую строку, а затем нажать l. Конечно, вы также можете запрограммировать свой собственный ярлык, ссылки доступны на веб-сайте записной книжки jupyter.
flowera 08

1
Я всегда использую «p» для отображения списка команд в записной книжке Jupyter. Когда я пишу «показывать номера строк», команда появляется там с ярлыком рядом с ней. Вы также можете узнать ярлык команды, которую хотите использовать.
Ad Infinitum

8

После того, как вы получите ошибку, в следующей ячейке просто запустите %debugи все.


1
это замечательно!
Кто-то

однако это должно дождаться возникновения исключения, мы можем захотеть проверить, что является переменной во время выполнения, установив некоторую точку останова
Лук Арон,

7

Также можно использовать %pdbволшебную команду . Просто скажите, %pdb onи впоследствии pdbотладчик будет работать со всеми исключениями, независимо от того, насколько глубоко в стеке вызовов. Очень кстати.

Если у вас есть конкретная строка, которую вы хотите отлаживать, просто вызовите там исключение (часто это уже происходит!) Или используйте %debugволшебную команду, которую предлагают другие люди.


5

Я только что открыл для себя PixieDebugger . Даже подумав, что у меня еще не было времени протестировать его, это действительно кажется наиболее похожим способом отладки, как мы используем в ipython с ipdb.

введите описание изображения здесь

Также есть вкладка "оценка"


0

Собственный отладчик становится доступным как расширение JupyterLab. Выпущенный несколько недель назад, его можно установить, получив соответствующее расширение, а также ядро ​​xeus-python (которое, в частности, поставляется без магии, хорошо известной пользователям ipykernel):

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

Это обеспечивает визуальную отладку, хорошо известную по другим IDE.

введите описание изображения здесь

Источник: визуальный отладчик для Jupyter.


xeus-python не работает в моей Windows 10. Проверьте мою проблему xeus-python issue на github
сергземск,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.