Jak przejść przez kod Python, aby pomóc w debugowaniu problemów?

185

W Javie / C # możesz łatwo przechodzić przez kod, aby prześledzić, co może być nie tak, a IDE czyni ten proces bardzo przyjaznym dla użytkownika.

Czy potrafisz prześledzić kod Pythona w podobny sposób?

Blankman
źródło

Odpowiedzi:

264

Tak! Istnieje tylko debugger Pythona, który pdbjest do tego przeznaczony!

Możesz uruchomić program w języku Python za pdbpomocą pdb myscript.pylub python -m pdb myscript.py.

Można wtedy wydać kilka poleceń, które są udokumentowane na pdbstronie.

Niektóre przydatne do zapamiętania to:

  • b: ustaw punkt przerwania
  • c: kontynuuj debugowanie, aż osiągniesz punkt przerwania
  • s: przejdź przez kod
  • n: aby przejść do następnego wiersza kodu
  • l: wyświetla kod źródłowy bieżącego pliku (domyślnie: 11 wierszy, w tym wykonywany wiersz)
  • u: nawigacja w górę ramki stosu
  • d: nawiguj w dół ramki stosu
  • p: aby wydrukować wartość wyrażenia w bieżącym kontekście

Jeśli nie chcesz używać debuggera z linii poleceń, niektóre IDE, takie jak Pydev , Wing IDE lub PyCharm, mają debugger z GUI. Wing i PyCharm są produktami komercyjnymi, ale Wing ma bezpłatną edycję „Personal”, a PyCharm ma bezpłatną edycję dla społeczności.

mit
źródło
10
Wow, nie mogę uwierzyć, że mam trudności ze znalezieniem graficznego pdb dla systemu Linux / Ubuntu. Czy coś brakuje? Być może będę musiał opracować dla niego wtyczkę SublimeText.
ThorSummoner
4
PyCharm jest całkiem niezły jako graficzny debugger, a jego wydanie społecznościowe jest bezpłatne!
Pieter
@ThorSummoner, pudbświetnie się do tego nadaje . Równieżpydev
alpha_989
pdbnie jest narzędziem wiersza poleceń. Aby go użyć, użyj python -m pdb your_script.py.
jdhao,
@jdhao Chyba nie jest to standard, ale w Ubuntu pdbpolecenie jest częścią pythonpakietu. W każdym razie python -m <module>staje się standardem także dla innych rzeczy pip, więc prawdopodobnie najlepiej jest użyć tego domyślnie.
wjandrea
55

Za pomocą interaktywnego debugera Python „pdb”

Pierwszym krokiem jest skłonienie interpretera języka Python do przejścia w tryb debugowania.

A. Z wiersza poleceń

Najprostsza droga, uruchamiana z wiersza poleceń interpretera python

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B. W ramach tłumacza

Opracowując wczesne wersje modułów i eksperymentując z nimi bardziej iteracyjnie.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C. Z poziomu programu

W przypadku dużego projektu i długotrwałego modułu można rozpocząć debugowanie od wewnątrz programu za pomocą importu pdb i set_trace () w następujący sposób:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

Debugowanie krok po kroku, aby uzyskać bardziej wewnętrzny

  1. Wykonaj następną instrukcję… za pomocą „n” (next)

  2. Powtarzanie ostatniego polecenia debugowania… za pomocą ENTER

  3. Porzucenie wszystkiego… za pomocą „q” (wyjście)

  4. Drukowanie wartości zmiennych… za pomocą „p” (drukuj)

    a) pa

  5. Wyłączanie monitu (Pdb)… za pomocą „c” (kontynuuj)

  6. Sprawdzanie, gdzie jesteś… za pomocą „l” (lista)

  7. Wchodzenie do podprogramów… za pomocą „s” (wejście w)

  8. Kontynuacja… ale tylko do końca bieżącego podprogramu… z „r” (powrót)

  9. Przypisz nową wartość

    a) ! b = „B”

  10. Ustaw punkt przerwania

    a) złamać numer pościeli

    b) przerwij nazwę funkcji

    c) zepsuj nazwę pliku: numer bielizny

  11. Tymczasowy punkt przerwania

    a) numer pościeli

  12. Warunkowy punkt przerwania

    a) złamać numer pościeli, stan

Uwaga: ** Wszystkie te polecenia należy wykonać z ** pdb

Aby uzyskać dogłębną wiedzę, patrz: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/

akD
źródło
41

W pythonie znajduje się moduł o nazwie „pdb”. Na górze skryptu pythonowego robisz

import pdb
pdb.set_trace()

i wejdziesz w tryb debugowania. Możesz użyć „s”, aby przejść, „n”, aby przejść do następnego wiersza, podobnie jak w przypadku debugera „gdb”.

Senthil Kumaran
źródło
21

Począwszy od Python 3.7, możesz użyć breakpoint()wbudowanej funkcji, aby wejść do debuggera:

foo()
breakpoint()  # drop into the debugger at this point
bar()

Domyślnie breakpoint()importuje pdbi dzwoni pdb.set_trace(). Można jednak kontrolować zachowanie podczas debugowania za sys.breakpointhook()pomocą zmiennej środowiskowej i jej używania PYTHONBREAKPOINT.

Aby uzyskać więcej informacji, zobacz PEP 553 .

Eugene Yarmash
źródło
2
Kiedy zobaczyłem, breakpointbyłem podekscytowany. Ale potem dowiedziałem się, że jest to po prostu skrót do import pdb; pdb.set_trace()tego i to mnie zasmuciło. Python DEVS: proszę skupić się na poprawie WPB z podstawowych usług, takich jak GDB linii kontekstowych, uporczywy historii poleceń i zakładki autouzupełnianie :-)
Ciro Santilli郝海东冠状病六四事件法轮功
11

ipdb (debugger IPython)

ipdb dodaje funkcjonalność IPython do pdb, oferując następujące OGROMNE ulepszenia:

  • uzupełnianie kart
  • pokaż więcej linii kontekstu
  • podświetlanie składni

Podobnie jak pdg, ipdb jest wciąż daleki od ideału i całkowicie szczątkowy w porównaniu z GDB, ale jest już ogromną poprawą w porównaniu z pdb.

Użycie jest analogiczne pdb, wystarczy zainstalować z:

python3 -m pip install --user ipdb

a następnie dodaj do linii, z której chcesz krok debugować:

__import__('ipdb').set_trace(context=21)

Prawdopodobnie zechcesz dodać do tego skrót ze swojego edytora, np. Do snipmate Vima Mam:

snippet ipd
    __import__('ipdb').set_trace(context=21)

więc mogę wpisać just ipd<tab>i rozwija się do punktu przerwania. Dzięki temu usunięcie jest łatwe, ddponieważ wszystko jest zawarte w jednym wierszu.

context=21zwiększa liczbę linii kontekstu, jak wyjaśniono na stronie: Jak sprawić, aby ipdb wyświetlał więcej linii kontekstu podczas debugowania?

Alternatywnie możesz również debugować programy od samego początku za pomocą:

ipdb3 main.py

ale generalnie nie chcesz tego robić, ponieważ:

  • musiałbyś przejść przez wszystkie definicje funkcji i klas, gdy Python odczytuje te wiersze
  • Nie wiem, jak ustawić tam rozmiar kontekstu bez włamania się do ipdb. Łatka na to pozwala: https://github.com/gotcha/ipdb/pull/155

Lub alternatywnie, jak w surowym pdb 3.2+, możesz ustawić niektóre punkty przerwania z wiersza poleceń:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

chociaż -c cz jakiegoś powodu jest zepsuty: https://github.com/gotcha/ipdb/issues/156

python -m moduledebugowanie zostało zadane na stronie: Jak debugować moduł Pythona uruchamiany z python -m z wiersza poleceń? a ponieważ Python 3.7 można wykonać za pomocą:

python -m pdb -m my_module

Poważne brakujące funkcje zarówno pdb, jak i ipdb w porównaniu z GDB:

Irytacje specyficzne dla ipdb:

Testowane w Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.

Ciro Santilli
źródło
5

Obecnie istnieje breakpoint()metoda, która zastępuje import pdb; pdb.set_trace().

Ma także kilka nowych funkcji , takich jak możliwe zmienne środowiskowe.

Johnnyheineken
źródło
3

Jeśli pochodzisz z języka Java / C #, chyba najlepszym rozwiązaniem będzie użycie Eclipse z Pydevem . Daje to w pełni funkcjonalne IDE z wbudowanym debuggerem. Używam go również z django.

Liorsion
źródło
2

Jeśli chcesz IDE ze zintegrowanym debuggerem, wypróbuj PyScripter .

kindall
źródło
2

Python Tutor to internetowy debugger przeznaczony dla początkujących. Możesz wpisać kod na stronie edycji, a następnie kliknąć „Wizualizacja wykonania”, aby uruchomić.

Obsługuje między innymi:

Jednak nie obsługuje również wielu rzeczy , na przykład:

  • Odczytywanie / zapisywanie plików - użyj io.StringIOi io.BytesIOzamiast tego: demo
  • Kod, który jest zbyt duży, działa zbyt długo lub definiuje zbyt wiele zmiennych lub obiektów
  • Argumenty wiersza polecenia
  • Wiele standardowych modułów bibliotecznych, takich jak argparse, csv, enum, html, os, struct, poorref ...
wjandrea
źródło
1

Możliwe jest także programowe przechodzenie i śledzenie kodu Pythona (i jest to łatwe!). Spójrz na sys.settrace () dokumentacji dla więcej szczegółów. Również tutaj jest samouczek na dobry początek.

Samouk
źródło
1

PyCharm to IDE dla Pythona, które zawiera debugger. Obejrzyj ten film na YouTube, aby zapoznać się z wprowadzeniem debugera PyCharm do przejścia przez kod.

Samouczek PyCharm - debugowanie kodu python za pomocą PyCharm

Uwaga: nie jest to rekomendacja ani przegląd. PyCharm to produkt komercyjny, za który trzeba zapłacić, ale firma zapewnia bezpłatną licencję dla uczniów i nauczycieli, a także „lekką” wersję społecznościową, która jest bezpłatna i open source.

Zrzut ekranu

Jim
źródło