Jaki jest właściwy sposób debugowania w notatniku iPython?

121

Jak wiem, %debug magicmożna debugować w ramach jednej komórki.

Jednak mam wywołania funkcji w wielu komórkach.

Na przykład,

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

Co próbowałem:

  1. Próbowałem ustawić %debugw pierwszej linii komórki-1. Ale natychmiast wchodzi w tryb debugowania, nawet przed wykonaniem cell-2.

  2. Próbowałem dodać %debugwiersz tuż przed kodem return do_some_thing_about(b). Ale wtedy kod działa wiecznie, nigdy się nie zatrzymuje.

Jaki jest właściwy sposób ustawienia punktu przerwania w notebooku ipython?

Rex
źródło

Odpowiedzi:

73

Użyj ipdb

Zainstaluj go przez

pip install ipdb

Stosowanie:

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)

Do wykonywania wiersza po wierszu noraz do przejścia do użycia funkcji si wyjścia z używania zachęty do debugowania c.

Pełna lista dostępnych poleceń: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf

Tevin Joseph KO
źródło
ipdb nie wyświetla zachęty do debugowania w drugiej komórce z przykładowym kodem wymienionym w pytaniu. Teraz kod działa wiecznie.
Rex
@Rex Dla mnie to działa. Gdzie umieściłeś ipdb? Umieść import ipdb; ipdb.set_trace (); przed wierszem return do_some_thing_about (b). Następnie wywołaj fun1 (a) z drugiej komórki, powinno działać. Aby wyjść z trybu debugowania, użyj „c”
Tevin Joseph KO
@Rex Zaktualizował odpowiedź dla większej jasności.
Tevin Joseph KO
29
Działa to w konsoli iPython, ale nie w notebooku iPython (o to właśnie zadawano pytanie). Kiedy piszę import ipdb; ipdb.set_trace()w komórce notesu, jest napisaneMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill
1
nowy w jupyter ... wydaje się, że jest bardziej odpowiedni do prezentacji i udostępniania fragmentów kodu ... czy możemy mieć funkcje, które zapewniają IDE (takie jak eclipse, rstudio), takie jak rzeczywiste debugowanie, krok po kroku, punkty przerwania, dodawanie zegarka do wyrażenia i zmienne itp. Na początku wydaje się, że tak nie jest, po prostu chcę mieć pewność .....
Mahesha999
90

Możesz używać ipdbinside jupyter z:

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

Edycja : powyższe funkcje są przestarzałe od wersji IPython 5.1. Oto nowe podejście:

from IPython.core.debugger import set_trace

Dodaj miejsce, w set_trace()którym potrzebujesz punktu przerwania. Wpisz helpdo ipdbpoleceń, gdy pojawi się pole wprowadzania.

Leopd
źródło
20
Tracerzostała umorzona. Teraz działa w ten sposób: from IPython.core.debugger import set_tracei set_trace()wywołuje punkt przerwania. Źródło: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko
1
Przydatne do użycia jako jedna linia, gdziekolwiek jest to potrzebne:from IPython.core.debugger import set_trace;set_trace()
Nir
15

Twoja funkcja zwrotna jest w wierszu funkcji def (funkcja główna), musisz podać jej jedną tabulację. I użyć

%%debug 

zamiast

%debug 

debugować całą komórkę, a nie tylko linię. Mam nadzieję, że to ci pomoże.

Mohit Khurana
źródło
12

Zawsze możesz dodać to w dowolnej komórce:

import pdb; pdb.set_trace()

a debugger zatrzyma się w tej linii. Na przykład:

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

In[2]: fun1(1)
krock
źródło
Czy powinno to być ipdb?
Rex
1
@Rex Niekoniecznie. ipdbjest refaktorem Python Debugger, który jest ściślej zintegrowany z IPythonem. pdbjest wbudowany.
Two-Bit Alchemist
ipdbmoże być również używany poza powłoką ipython i zawiera pewne udogodnienia, takie jak uzupełnianie zakładek.
stycznia
12

W Pythonie 3.7 możesz użyć funkcji breakpoint () . Po prostu wejdź

breakpoint()

gdziekolwiek chcesz, aby runtime się zatrzymał i stamtąd możesz użyć tych samych poleceń pdb (r, c, n, ...) lub ocenić swoje zmienne.

Vlad Bezden
źródło
2
Aby to dodać, po wywołaniu breakpoint () możesz wpisać „help” w polu tekstowym, które się pojawi, aby uzyskać listę poleceń.
gbeaven
Wydaje się, że po użyciu breakpoint () lub pdb występuje trwały problem z zawieszaniem się: github.com/ipython/ipython/issues/10516
Dave Liu,
8

Po prostu wpisz import pdbnotatnik jupyter, a następnie użyj tej ściągawki do debugowania. To bardzo wygodne.

c-> kontynuuj, s-> krok, b 12-> ustaw punkt przerwania w linii 12 i tak dalej.

Kilka przydatnych linków: Oficjalny dokument Pythona na pdb , przykłady debuggera Pythona pdb dla lepszego zrozumienia, jak używać poleceń debuggera .

Kilka przydatnych zrzutów ekranu: wprowadź opis obrazu tutajwprowadź opis obrazu tutaj

flowera
źródło
Dobra odpowiedź. Jednak myślę (jestem nowy w notatniku Jupyter), aby ustawić punkt przerwania, należy dodać% debug.
Ad Infinitum
To, co robię, to kopiowanie i wklejanie pdb.set_trace()w miejscu, w którym chcę ustawić punkt przerwania, ponieważ b line_nonie działa w Jupyter Notebook i działa dobrze na Pythonie IDLE.
flowera
Dzięki! Wrzuciłem też kilka zrzutów ekranu, które dzisiaj przetestowałem. Gdybym mógł przełączyć się na Python IDLE, chciałbym to zrobić ..
flowera
Znajduję również sposób na wyświetlenie numeru linii w notatniku jupyter, kliknięcie w nową linię, a następnie naciśnięcie l. Oczywiście możesz również zaprogramować własny skrót, linki są dostępne na stronie notebooków jupyter.
flowera
1
Zawsze używam „p”, aby wyświetlić listę poleceń w notatniku Jupyter. Kiedy piszę „pokaż numery wierszy”, pojawia się tam polecenie ze skrótem obok niego. Możesz także nauczyć się skrótu polecenia, którego chcesz użyć.
Ad Infinitum
8

Po pojawieniu się błędu w następnej komórce po prostu uruchom %debugi to wszystko.

Escachator
źródło
1
to jest niesamowite!
Ktoś
jednak musi to poczekać na wystąpienie wyjątku, możemy chcieć przetestować, jaka jest zmienna w środowisku wykonawczym, ustawiając jakiś punkt przerwania
Luk Aron
7

%pdbKomenda magia jest dobra do wykorzystania jako dobrze. Po prostu powiedz, %pdb ona następnie pdbdebugger będzie działał na wszystkich wyjątkach, bez względu na to, jak głęboko w stosie wywołań. Bardzo poręczne.

Jeśli masz konkretną linię, którą chcesz debugować, po prostu zgłoś tam wyjątek (często już jesteś!) Lub użyj %debugmagicznego polecenia, które sugerowali inni ludzie.

wodoodporny
źródło
5

Właśnie odkryłem PixieDebugger . Nawet myśląc, że nie miałem jeszcze czasu, aby go przetestować, wydaje się, że to naprawdę najbardziej podobny sposób debugowania sposobu, w jaki jesteśmy używani w ipythonie z ipdb

wprowadź opis obrazu tutaj

Zawiera również zakładkę „Ocena”

Alessandro Dentella
źródło
0

Natywny debugger jest udostępniany jako rozszerzenie JupyterLab. Wydany kilka tygodni temu, można go zainstalować, pobierając odpowiednie rozszerzenie, a także jądro xeus-python (które w szczególności jest dostarczane bez magii dobrze znanej użytkownikom ipykernel):

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

Umożliwia to wizualne debugowanie dobrze znane z innych IDE.

wprowadź opis obrazu tutaj

Źródło: wizualny debugger dla Jupyter

zepsuty
źródło
xeus-python nie działa na moim systemie Windows 10. Sprawdź mój problem Problem xeus-python na github
sergzemsk