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.