Jakie są twoje najlepsze wskazówki dotyczące debugowania Pythona?
Proszę nie wymieniać konkretnego debuggera bez mówienia, co on właściwie potrafi.
Związane z
- Jakie są dobre sposoby, aby mój kod w Pythonie był uruchamiany po raz pierwszy? - Omówiono minimalizowanie błędów
Odpowiedzi:
PDB
Możesz użyć modułu pdb, wstawić w
pdb.set_trace()
dowolnym miejscu i będzie on działał jako punkt przerwania.Aby kontynuować wykonywanie, użyj
c
(lubcont
lubcontinue
).Możliwe jest wykonanie dowolnych wyrażeń Pythona za pomocą pdb. Na przykład, jeśli znajdziesz błąd, możesz poprawić kod, a następnie wpisać wyrażenie typu, aby uzyskać ten sam efekt w uruchomionym kodzie
ipdb to wersja pdb dla IPythona . Pozwala na użycie pdb ze wszystkimi funkcjami IPythona, w tym uzupełnianiem tabulatorów.
Możliwe jest również ustawienie pdb tak, aby automatycznie uruchamiał się w przypadku nieprzechwyconego wyjątku.
Pydb został napisany jako ulepszona wersja Pdb. Korzyści?
źródło
myserver.com/pdb
w trybie debugowania, który po prostu to robiimport pdb; pdb.set_trace()
. Jeśli używasz Flask / Werkzeug, który ma interaktywny debugger, możesz również mieć widok, który po prostu działaassert False
.http://pypi.python.org/pypi/pudb , pełnoekranowy, oparty na konsoli debugger Pythona.
Przyjemne do debugowania samodzielnych skryptów, po prostu uruchom
źródło
pip install pudb
Jeśli używasz pdb, możesz zdefiniować aliasy dla skrótów. Używam tych:
źródło
Logowanie
Python ma już doskonały wbudowany moduł logowania . Możesz tutaj użyć szablonu rejestrowania .
Moduł rejestrowania umożliwia określenie poziomu ważności; podczas debugowania możesz rejestrować wszystko, podczas gdy podczas normalnej pracy możesz rejestrować tylko krytyczne rzeczy. Możesz włączać i wyłączać różne rzeczy.
Większość ludzi po prostu używa podstawowych instrukcji print do debugowania, a następnie usuwa instrukcje print. Lepiej je zostawić, ale wyłącz je; wtedy, gdy pojawi się kolejny błąd, możesz po prostu ponownie włączyć wszystko i przejrzeć dzienniki.
Może to być najlepszy możliwy sposób debugowania programów, które muszą działać szybko, takich jak programy sieciowe, które muszą odpowiedzieć, zanim drugi koniec połączenia sieciowego wygaśnie i znika. Możesz nie mieć dużo czasu na jednoetapowe uruchamianie debuggera; ale możesz po prostu pozwolić uruchomić kod i zarejestrować wszystko, a następnie przejrzeć dzienniki i dowiedzieć się, co się naprawdę dzieje.
EDYCJA: Oryginalny adres URL szablonów to: http://aymanh.com/python-debugging-techniques
Brakuje tej strony, więc zastąpiłem ją odniesieniem do migawki zapisanej na archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques
Na wypadek, gdyby znowu zniknął, oto szablony, o których wspomniałem. To jest kod pobrany z bloga; Nie napisałem tego.
A oto jego wyjaśnienie, jak korzystać z powyższego. Ponownie, nie mam za to uznania:
Domyślnie moduł rejestrowania wyświetla komunikaty krytyczne, komunikaty o błędach i ostrzeżenia. Aby to zmienić, aby wszystkie poziomy były drukowane, użyj:
Aby wysłać komunikaty dziennika do pliku o nazwie debug.log, użyj:
źródło
Możliwe jest wydrukowanie, jakie wiersze Pythona są wykonywane (dzięki Geo!). Ma dowolną liczbę aplikacji, na przykład możesz go zmodyfikować, aby sprawdzić, kiedy wywoływane są określone funkcje lub dodać coś takiego jak ##, aby śledził tylko określone linie.
code.interact przenosi Cię do interaktywnej konsoli
Jeśli chcesz mieć łatwy dostęp do historii swojej konsoli, spójrz na: „ Czy mogę mieć mechanizm historii taki jak w powłoce? ” (Będę musiał spojrzeć w dół).
Tłumaczowi można włączyć autouzupełnianie .
źródło
ipdb jest jak pdb, z niesamowitością ipythona.
źródło
print
sprawozdaniadebug_print
funkcję zamiast drukowania w celu łatwego wyłączeniapprint
Moduł nieocenione złożonych strukturźródło
oczywisty sposób debugowania skryptu
jeśli nie wiesz dokładnie, gdzie jest ten skrypt
źródło
PyDev
PyDev ma całkiem niezły interaktywny debugger. Zawiera wyrażenia obserwacyjne, najedź do oceny, listy wątków i stosów oraz (prawie) wszystkie zwykłe udogodnienia, których oczekujesz od nowoczesnego debugera wizualnego. Możesz nawet podłączyć się do działającego procesu i przeprowadzić zdalne debugowanie.
Jednak podobnie jak inne debugery wizualne, uważam, że jest on przydatny głównie w przypadku prostych problemów lub bardzo skomplikowanych problemów po wypróbowaniu wszystkiego innego. Nadal wykonuję większość ciężkich prac z wyrębem.
źródło
Jeśli znasz program Visual Studio, szukasz narzędzi języka Python dla programu Visual Studio .
źródło
Winpdb jest bardzo fajny i wbrew swojej nazwie jest całkowicie wieloplatformowy.
Ma bardzo fajny debugger oparty na podpowiedziach i GUI oraz obsługuje zdalne debugowanie.
źródło
W Vimie mam te trzy wiązania:
rpdb2
to Remote Python Debugger, którego można używać z WinPDB, solidnym graficznym debugerem. Ponieważ wiem, że zapytasz, może zrobić wszystko, czego oczekuję od debugera graficznego :)Używam
pdb
from,nose.tools
aby móc debugować testy jednostkowe, a także normalny kod.Na koniec
F7
mapowanie wydrukuje traceback (podobny do tego, jaki otrzymujesz, gdy wyjątek przesuwa się na szczyt stosu). Zauważyłem, że jest naprawdę przydatny więcej niż kilka razy.źródło
Definiowanie przydatnych metod repr () dla twoich klas (abyś mógł zobaczyć, czym jest obiekt) i użycie repr () lub "% r"% (...) lub "... {0! R} ..". Format (...) w wiadomościach / dziennikach debugowania jest kluczem IMHO do wydajnego debugowania.
Ponadto debuggery wymienione w innych odpowiedziach będą korzystać z metod repr ().
źródło
Pobieranie śladu stosu z działającej aplikacji w języku Python
Istnieje kilka sztuczek tutaj . Obejmują one
źródło
Jeśli nie lubisz spędzać czasu w debuggerach (i nie doceniasz słabej użyteczności
pdb
interfejsu wiersza poleceń), możesz zrzucić ślad wykonania i przeanalizować go później. Na przykład:Spowoduje to zrzucenie wszystkich linii źródłowych
setup.py install
wykonania doexecution.log
.Aby ułatwić dostosowywanie wyników śledzenia i pisanie własnych znaczników, umieściłem kilka fragmentów kodu w module xtrace (domena publiczna).
źródło
Jeśli to możliwe, debuguję używając
M-x pdb
w emacsie do debugowania na poziomie źródła.źródło
Istnieje pełny kurs online o nazwie „ Debugowanie oprogramowania ” autorstwa Andreasa Zellera w serwisie Udacity, zawierający wskazówki dotyczące debugowania:
Wysoce rekomendowane.
źródło
jeśli chcesz mieć ładny graficzny sposób drukowania stosu wywołań w czytelny sposób, sprawdź to narzędzie: https://github.com/joerick/pyinstrument
Uruchom z wiersza poleceń:
Uruchom jako moduł:
Uruchom z django:
Po prostu dodaj
pyinstrument.middleware.ProfilerMiddleware
doMIDDLEWARE_CLASSES
, a następnie dodaj?profile
na końcu adresu URL żądania, aby aktywować profiler.źródło