Який правильний спосіб налагодження в ноутбуці 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?

Відповіді:


72

Використовуйте 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 Для мене це працює. Куди ви поставили ipdb? Покласти імпорт ipdb; ipdb.set_trace (); перед поверненням рядка 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всередину соковижималки з:

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()
Nir

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?
Рекс

1
@Rex Не обов'язково. ipdbє рефактором налагоджувача Python, який більш тісно інтегрований з IPython. pdbвбудований.
Двобітовий алхімік

ipdbтакож можна використовувати за межами оболонки ipython і має деякі зручності, такі як заповнення вкладок.
Jan

12

У Python 3.7 ви можете використовувати функцію точки розриву () . Просто введіть

breakpoint()

де б ви не хотіли, щоб час виконання зупинився і звідти ви можете використовувати ті самі команди pdb (r, c, n, ...) або оцінити свої змінні.


2
Щоб додати це, під час виклику точки перерви (), ви можете ввести "help" у текстове поле, яке з'явиться, щоб отримати список команд.
gbeaven

Здається, виникла проблема з припиненням роботи після використання точки прориву
Дейв Лю

8

Просто введіть import pdbу зошит юпітер, а потім скористайтеся цією шпаргалкою для налагодження. Це дуже зручно.

c-> продовжити, s-> крок, b 12-> встановити точку розриву у рядку 12 тощо.

Деякі корисні посилання: Офіційний документ Python на pdb , приклади налагодження Python pdb для кращого розуміння того, як використовувати команди налагодження .

Деякі корисні скріншоти: введіть тут опис зображеннявведіть тут опис зображення


Хороша відповідь. Однак я думаю (я новачок у ноутбуці Юпітера) слід додати% debug, щоб встановити точку перерви.
Ad Infinitum

Що я роблю, це копіювати та вставляти pdb.set_trace()туди, де я хочу встановити точку розриву, оскільки b line_noце не працює в Jupyter Notebook і добре працює на python IDLE.
Flowera

Дякую! Я також завантажив кілька скріншотів, які я протестував сьогодні. Якби я міг перейти на Python IDLE, я хотів би це зробити ..
Flowera

Крім того, я знаходжу спосіб показати номер рядка в зошиті юпітера, натисніть новий рядок, а потім натисніть l. Звичайно, ви також можете запрограмувати власний ярлик, посилання доступні на веб-сайті ноутбука юпітера.
Flowera

1
Я завжди використовую "p", щоб показати список команд у зошиті Юпітера. Коли я пишу "показати номери рядків", з'являється команда з ярликом поруч. Ви також можете дізнатися ярлик команди, яку ви хочете використовувати.
Ad Infinitum

8

Після отримання помилки, у наступній комірці просто запустіть %debugі все.


1
це неймовірно!
Хтось

однак для цього потрібно чекати винятку, ми можемо захотіти перевірити, що є змінною під час виконання, встановивши деяку точку розриву
Luk Aron

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.

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

Джерело: Візуальний налагоджувач для Юпітера


xeus-python не працює в моїй Windows 10. Перевірте свою проблему xeus-python issue на github
sergzemsk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.