Wskazówki debugowania Pythona [zamknięte]

Jakie są Twoje najlepsze wskazówki dotyczące debugowania Pythona?

Proszę, nie wymieniaj konkretnego debugera bez mówienia, co on naprawdę może zrobić.

Powiązane

18 answers

PDB

Możesz użyć modułu pdb, wstawić pdb.set_trace() w dowolnym miejscu i będzie on działał jako punkt przerwania.

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

Aby kontynuować wykonanie użyj c (lub cont lub continue).

Możliwe jest wykonywanie dowolnych wyrażeń Pythona przy użyciu pdb. Na przykład, jeśli znajdziesz błąd, możesz poprawić kod, a następnie wpisz wyrażenie typu, aby uzyskać taki sam efekt w uruchomionym kodzie

Ipdb jest wersją pdb dla IPython . Pozwala na wykorzystanie pdb z wszystkie funkcje IPython, w tym uzupełnianie kart.

Możliwe jest również ustawienie pdb tak, aby automatycznie uruchamiał na nieobciążonym wyjątku.

Pydb został napisany jako ulepszona wersja Pdb. Korzyści?

 139
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-04 14:57:18

Http://pypi.python.org/pypi/pudb , pełnoekranowy, konsolowy debugger Pythona.

Jego celem jest dostarczenie wszystkich funkcjonalności nowoczesnych debugerów opartych na GUI w bardziej lekkim i przyjaznym dla Klawiatury pakiecie. PuDB pozwala debugować kod bezpośrednio tam, gdzie piszesz i testujesz go-w terminalu. Jeśli pracowałeś z doskonałymi (ale obecnie starożytnymi) narzędziami Turbo Pascala lub C, interfejs PuDB może wyglądać znajomo.

zrzut ekranu pudb

Ładny do debugowania samodzielne skrypty, po prostu uruchom

python -m pudb.run my-script.py
 78
Author: miku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-20 22:46:13

Jeśli używasz pdb, możesz zdefiniować aliasy dla skrótów. Używam tych:

# Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d
 40
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 10:16:35

Logowanie

Python ma już doskonały wbudowany moduł logowania . Możesz użyć szablonu logging tutaj .

Moduł logowania pozwala określić poziom ważności; podczas debugowania można rejestrować wszystko, podczas gdy podczas normalnej pracy można rejestrować tylko krytyczne rzeczy. Możesz wyłączać i włączać.

Większość ludzi używa tylko podstawowych instrukcji print do debugowania, a następnie usuwa instrukcje print. Lepiej zostawić je w, ale je wyłączyć; następnie, gdy masz inny błąd, można po prostu ponownie włączyć wszystko i przejrzeć swoje 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 czasu połączenia sieciowego wygaśnie i zniknie. Możesz nie mieć zbyt wiele czasu, aby wykonać jeden krok debuggera; ale możesz po prostu pozwolić swojemu kodowi działać i rejestrować wszystko, a następnie przeglądać dzienniki i dowiedzieć się, co jest naprawdę.

EDIT: oryginalny adres URL dla 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 znika, oto szablony, o których wspomniałem. To jest kod zaczerpnięty z bloga, nie napisałem go.

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __name__ == '__main__':
  main()

A oto jego wyjaśnienie, jak korzystać z powyższego. Znowu nie dostaję za to uznania:


Domyślnie moduł logging wyświetla komunikaty krytyczne, o błędach i ostrzegawcze. Aby zmienić to tak, że wszystkie poziomy są drukowane, użyj:

$ ./your-program.py --logging=debug

Wysyłanie wiadomości dziennika do pliku o nazwie debug.log, use:

$ ./your-program.py --logging-level=debug --logging-file=debug.log

 33
Author: steveha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-01 05:24:55

Możliwe jest drukowanie tego, co linie Pythona są wykonywane (dzięki Geo!). Ma to dowolną liczbę aplikacji, na przykład, można go zmodyfikować, aby sprawdzić, kiedy poszczególne funkcje są wywoływane lub dodać coś w stylu##, aby śledzić tylko poszczególne linie.

Kod.interact przenosi cię do interaktywnej konsoli

import code; code.interact(local=locals())

Jeśli chcesz mieć łatwy dostęp do historii konsoli, spójrz na: " Czy Mogę mieć mechanizm historii, taki jak w powłoce? " (will have to look w dół dla niego).

Autouzupełnianie może być włączone dla interpretera .

 20
Author: Casebash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:12

Ipdb jest jak pdb, z niesamowitością ipython.

 19
Author: Alex Gaynor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 04:33:33

print statements

  • niektórzy zalecają funkcję debug_print zamiast drukowania dla łatwego wyłączania
  • moduł pprint jest nieoceniony dla złożonych struktur
 17
Author: hasen j,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 04:44:30

Oczywisty sposób debugowania skryptu

python -m pdb script.py
  • przydatne, gdy skrypt podnosi wyjątek
  • przydatne, gdy polecenie virtualenv i pdb nie jest uruchomione z wersją Pythona venvs.

Jeśli nie wiesz dokładnie gdzie jest ten skrypt

python -m pdb ``which <python-script-name>``
 16
Author: vinilios,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-27 00:51:19

PyDev

PyDev ma całkiem niezły interaktywny debugger. Zawiera wyrażenia zegarka, hover-to-evaluate, listy wątków i stosów oraz (prawie) wszystkie typowe udogodnienia, których oczekujesz od nowoczesnego debuggera wizualnego. Można nawet dołączyć do uruchomionego procesu i zdalnego debugowania.

Podobnie jak inne Debugery wizualne, uważam, że jest przydatny głównie dla prostych problemów lub dla bardzo skomplikowanych problemów po wypróbowaniu wszystkiego innego. Nadal robię większość ciężkich podnoszenie z wyrębem.

 15
Author: itsadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 07:02:19

Jeśli znasz Visual Studio, Python Tools for Visual Studio jest tym, czego szukasz.

Tutaj wpisz opis obrazka

 15
Author: coordinate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 12:04:33

Winpdb jest bardzo ładny i wbrew nazwie jest całkowicie wieloplatformowy.

Posiada bardzo ładny debuger graficzny oparty na podpowiedzi i i obsługuje zdalne debugowanie.

 12
Author: orip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 11:47:14

W Vimie mam te trzy wiązania:

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2 jest zdalnym debugerem Pythona, który może być używany z winpdb, solidnym debugerem graficznym. Ponieważ Wiem, że zapytasz, może zrobić wszystko, czego oczekuję od debuggera graficznego:)

Używam pdb z nose.tools, aby móc debugować zarówno testy jednostkowe, jak i normalny kod.

Wreszcie, F7 mapowanie wyświetli traceback (podobny do tego, który otrzymujesz, gdy wyjątek bąbelki do górnej części stosu). I ' ve found it really przydatne więcej niż kilka razy.

 7
Author: David Wolever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 06:19:22

Definiowanie użytecznych metod repr () dla Twoich klas (dzięki czemu możesz zobaczyć, czym jest obiekt) i używając repr() lub "%r" % (...) lub"...{0!r}..".format (...) w wiadomości debugowania/dzienniki jest IMHO kluczem do skutecznego debugowania.

Również debuggery wymienione w innych odpowiedziach będą używać metod repr ().

 4
Author: Jacek Konieczny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-26 09:41:35

Pobieranie śladu stosu z uruchomionej aplikacji Pythona

Istnieje kilka sztuczek tutaj. Należą do nich

  • włamanie do interpretera / wydrukowanie śladu stosu poprzez wysłanie sygnału
  • uzyskiwanie śledzenia stosu z nieprzygotowanego procesu Pythona
  • uruchamianie interpretera z flagami, aby był przydatny do debugowania
 2
Author: Casebash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:52

Jeśli nie lubisz spędzać czasu w debuggerach (i nie doceniasz słabej użyteczności interfejsu linii poleceń pdb), możesz zrzucić wykonanie trace i przeanalizować je później. Na przykład:

python -m trace -t setup.py install > execution.log

Spowoduje zrzut całej linii źródłowej setup.py install do execution.log.

Aby ułatwić dostosowanie wyjścia śledzenia i napisanie własnych znaczników, poskładałem kilka fragmentów kodu do xtrace module (public domain).

 2
Author: anatoly techtonik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-02 05:53:49

Jeśli to możliwe, debuguję używając M-x pdb w Emacsie do debugowania na poziomie źródłowym.

 1
Author: themis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-26 04:42:11

Istnieje pełny kurs online o nazwie " debugowanie oprogramowania " autorstwa Andreasa Zellera na Udacity, pełen porad na temat debugowania:

Podsumowanie Kursu

W tej klasie dowiesz się jak systematycznie debugować programy, jak aby zautomatyzować proces debugowania i zbudować kilka zautomatyzowanych narzędzia do debugowania w Pythonie.

Po Co Ten Kurs?

Pod koniec tego kursu będziesz miał solidne zrozumienie o systemowego debugowania, będzie wiedział jak zautomatyzować debugowanie i będzie zbudowałem kilka funkcjonalnych narzędzi debugowania w Pythonie.

Wymagania wstępne i wymagania

Podstawowa znajomość programowania i Pythona na poziomie Udacity Wymagany jest CS101 lub lepszy. Podstawowe rozumienie zorientowanych obiektowo programowanie jest pomocne.

Gorąco polecam.

 1
Author: Udi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 22:08:35

Jeśli chcesz mieć ładny graficzny sposób na wydrukowanie stosu połączeń w czytelny sposób, sprawdź to narzędzie: https://github.com/joerick/pyinstrument

Uruchom z linii poleceń:

python -m pyinstrument myscript.py [args...]

Uruchom jako moduł:

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# code you want to profile

profiler.stop()
print(profiler.output_text(unicode=True, color=True))

Uruchom z django:

Po prostu dodaj pyinstrument.middleware.ProfilerMiddleware do MIDDLEWARE_CLASSES, a następnie dodaj ?profile na koniec adresu URL żądania, aby aktywować profiler.

 0
Author: Hutch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-31 14:45:50