Python: Debugger w Jupyter Notebook – postać znakowa

17-gru-2019

Programista bez debuggera, to jak mechanik bez klucza… to trzeba mieć!

Ostatnio bardzo popularnym narzędziem do tworzenia skryptów w Pythonie jest Jupyter Notebook. Niestety domyślnie menu nie ma polecenia debug… o ile w pojedynczych komórkach po prostu wykonujesz mało skomplikowane polecenia, to ewentualne dodanie polecenia print powinno pomóc i rozwiązać problem. Co jednak zrobić jeżeli masz nieco bardziej złożoną pętlę i coś w niej nie działa?

W charakterze kłopotliwego kodu wystąpi u nas taka pętla:

i = 1

while i < 10:
   print(i)
   i += 3
 
   if i % 2 == 0:
      i -= 2

print('done i={}'.format(i))

W sumie - nic skomplikowanego, ale zmienna sterująca i jest raz zwiększana, raz zmiejszana... idzie się pogubić, zwłaszcza po drinku.

W celu debuggowania w trybie "znakowym" wykonaj takie czynności:

  • załaduj moduł pdb:
import pdb
  • a następnie w miejscu, gdzie chcesz aby zatrzymał się program dodaj linijkę:
pdb.set_trace()

Czyli nasza kłopotliwa pętelka może teraz wyglądać tak:

import pdb

i = 1

while i < 10:
  print(i)
  i += 3
 
  if i % 2 == 0:
    pdb.set_trace()
    i -= 2

print('done i={}'.format(i))

Po uruchomieniu w/w kodu, kiedy wykonanie dotrze do linijki

pdb.set_trace()

program zatrzyma się prezentując proste pole do wprowadzenia instrukcji:

jeśli wpiszesz "i" i naciśniesz enter, to debugger wyświetli w odpowiedzi aktualną wartość i. W okienku możesz też podawać bardziej skomplikowane wyrażenia, np sprawdzać ile wynosi i % 2 lub czy i %2 == True itp.

Kiedy chcesz aby zostało wykonane kolejne polecenie wystarczy nacisnąć n i enter. A kiedy masz już dosyć przetwarzania linijka po linijce naciśnij c i enter

Można też wpisać help, na co debugger odpowie listą dostępnych poleceń, lub wpisać help <nazwa_komendy> i wtedy zobaczysz opis polecenia:

Nasza sesja debuggowania mogłaby więc koniec końców wyglądać tak:

 

 

Komentarze są wyłączone

Autor: Rafał Kraik