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?

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


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.


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.


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)

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.


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


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.


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.


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”


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


xeus-python nie działa na moim systemie Windows 10. Sprawdź mój problem Problem xeus-python na github
sergzemsk
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.