To pytanie zastanawiałem się od dłuższego czasu, ale nigdy nie znalazłem odpowiedniego rozwiązania. Jeśli uruchomię skrypt i napotkam, powiedzmy, błąd indeksu, python wypisuje wiersz, lokalizację i szybki opis błędu i kończy działanie. Czy możliwe jest automatyczne uruchomienie pdb po napotkaniu błędu? Nie jestem przeciwny posiadaniu dodatkowej instrukcji importu na górze pliku ani kilku dodatkowych wierszy kodu.
216
Odpowiedzi:
Możesz użyć traceback.print_exc, aby wydrukować śledzenie wyjątków. Następnie użyj sys.exc_info, aby wyodrębnić śledzenie i wreszcie wywołać pdb.post_mortem z tym śledzeniem
Jeśli chcesz uruchomić interaktywny wiersz poleceń za pomocą code.interact, używając ustawień lokalnych ramki, z której pochodzi wyjątek, możesz to zrobić
źródło
code
nadpdb
ponieważ ten ostatni wydaje się rozszerzać na byłego?code
?sys.exc_info
aby wyodrębnić ślad zwrotny i na końcu wywołaćpdb.post_mortem
ten ślad . Nie musisz przekazywać obiektu tracebackpdb.post_mortem
. Z dokumentacji : Jeśli nie podano śledzenia, wykorzystuje jeden z wyjątków, który jest obecnie obsługiwany (wyjątek musi być obsługiwany, jeśli ma być zastosowany domyślny).Jeśli nie podasz
-c continue
flagi, musisz wpisać „c” (dla Kontynuuj), gdy rozpocznie się wykonywanie. Następnie przejdzie do punktu błędu i da ci kontrolę. Jak wspomniano w eqzx , ta flaga jest nowym dodatkiem w Pythonie 3.2, więc wpisanie „c” jest wymagane we wcześniejszych wersjach Pythona (patrz https://docs.python.org/3/library/pdb.html ).źródło
gdb
; a kiedy wpiszesz „r”pdb
, program rzeczywiście działa, ale NIE zatrzymuje się (ani nie generuje śladu wstecznego) po błędzie; zastanawiałem się, dopóki tego nie przeczytam. Twoje zdrowie!ipdb
; i oczywiście po skrypcie można dodawać argumenty!Użyj następującego modułu:
Nazwij go
debug
(lub cokolwiek chcesz) i umieść go gdzieś na ścieżce Pythona.Teraz, na początku skryptu, po prostu dodaj
import debug
.źródło
try-catch
co jest po prostu brzydkie IMO.pudb
ponadpdb
. Powracam do kopiowania i wklejania, co z pewnością mówi coś o braku porządku w moim życiu.Ipython ma polecenie przełączające to zachowanie: % pdb . Robi dokładnie to, co opisałeś, może nawet nieco więcej (daje ci więcej informacji o śladach wstecznych z podświetlaniem składni i uzupełnianiem kodu). Zdecydowanie warto spróbować!
źródło
%debug
pozwala otworzyć debugger po napotkaniu błędu. Często wolę to niż%pdb
. (Kompromis polega jedynie na pisaniu zaq
każdym razem, gdy nie chcesz debugować błędu, a pisaniu za%debug
każdym razem, gdy chcesz debugować błąd.)c.InteractiveShell.pdb = True
w swoichipython_config.py
włącza się%pdb
automatycznie dla każdej sesji.To nie jest debugger, ale prawdopodobnie równie użyteczny (?)
Wiem, że słyszałem, jak Guido wspomniał o tym gdzieś w przemówieniu.
Właśnie sprawdziłem python - ?, a jeśli użyjesz polecenia -i, możesz wejść w interakcję w miejscu, w którym skrypt się zatrzymał.
Biorąc pod uwagę ten skrypt:
Możesz uzyskać ten wynik!
Szczerze mówiąc, nie korzystałem z tego, ale powinienem być, wydaje się bardzo przydatny.
źródło
IPython upraszcza to w wierszu poleceń:
można przepisać na
Lub podobnie, jeśli wywołujesz moduł:
można przepisać na
Zwróć uwagę,
--
aby zatrzymać IPython przed odczytaniem argumentów skryptu jako własnych.Ma to również tę zaletę, że wywołuje ulepszony debugger IPython (ipdb) zamiast pdb.
źródło
Jeśli używasz
ipython
, po uruchomieniu wpisz%pdb
źródło
Jeśli używasz środowiska IPython, możesz po prostu użyć% debugowania, a powłoka zabierze Cię z powrotem do linii obrażeń ze środowiskiem ipdb w celu przeprowadzenia kontroli itp. Inną opcją, jak wskazano powyżej, jest użycie iPython magic% pdb, który skutecznie działa to samo.
źródło
up
idown
, aby powrócić do wiersza kodu, który wygenerował błąd.Możesz umieścić tę linię w swoim kodzie:
Więcej informacji: Uruchom debuger w języku Python w dowolnej linii
źródło
Aby uruchomić go bez konieczności wpisywania c na początku, użyj:
Pdb ma własne argumenty wiersza poleceń: -cc wykona polecenie c (ontinue) na początku wykonywania, a program będzie działał nieprzerwanie aż do błędu.
źródło
python -m pdb script.py w python2.7 naciśnij kontynuuj, aby uruchomić, a on uruchomi się do błędu i przerwie tam w celu debugowania.
źródło
Jeśli korzystasz z modułu:
A teraz chcesz wprowadzić,
pdb
gdy wystąpi wyjątek, wykonaj następujące czynności:(lub przedłuż swój
PYTHONPATH
). JestPYTHONPATH
to konieczne, aby moduł znalazł się na ścieżce, ponieważpdb
moduł jest teraz uruchomiony .źródło
Umieść punkt przerwania wewnątrz konstruktora najwyższej klasy wyjątków w hierarchii i przez większość czasu zobaczysz, gdzie wystąpił błąd.
Umieszczenie punktu przerwania oznacza, co chcesz, aby to znaczyło: możesz użyć IDE
pdb.set_trace
, lub cokolwiek innegoźródło