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:
1 2 3 4 5 6 7 8 9 10 |
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:
1 |
import pdb |
- a następnie w miejscu, gdzie chcesz aby zatrzymał się program dodaj linijkę:
1 |
pdb.set_trace() |
Czyli nasza kłopotliwa pętelka może teraz wyglądać tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
1 |
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: