Interaktywne debugowanie Pythona wywołane punktem przerwania za pomocą IPython

Powiedzmy, że mam sesję Ipythona, z której wywołuję jakiś skrypt:

> run my_script.py

Czy istnieje sposób na wywołanie punktu przerwania w my_script.py, z którego mogę sprawdzić mój obszar roboczy z IPython?

Pamiętam, że czytałem, że w poprzednich wersjach Ipythona można było zrobić:

from IPython.Debugger import Tracer;     

def my_function():
    x = 5
    Tracer()
    print 5;

Ale podmoduł Debugger nie wydaje się być już dostępny.

Zakładając, że mam już otwartą sesję IPython: Jak mogę zatrzymać mój program w wybranej lokalizacji i sprawdzić moją przestrzeń roboczą z IPython ?

Ogólnie rzecz biorąc, wolałbym rozwiązania, które nie wymagają ode mnie wstępnego określania numerów linii, ponieważ chciałbym mieć więcej niż jedno takie wywołanie do Tracer() powyżej i nie muszę śledzić numerów linii, gdzie są.

Author: Amelio Vazquez-Reina, 2013-02-01

5 answers

Tracer() nadal istnieje w ipythonie w innym module. Można wykonać następujące czynności:

from IPython.core.debugger import Tracer

def my_function():
    x = 5
    Tracer()()
    print 5

Zwróć uwagę na dodatkowy nawias wywołania wokół Tracer

Edytuj: Tracer jest przestarzałe powinieneś użyć set_trace() zamiast

 27
Author: pankaj,
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-04-11 06:08:27

Możesz go uruchomić i ustawić punkt przerwania w danej linii za pomocą:

run -d -b12 myscript

Gdzie-b12 ustawia punkt przerwania w linii 12. Gdy wejdziesz w tę linię, natychmiast przejdziesz do pdb i będziesz musiał wprowadzić c, Aby wykonać do tego punktu przerwania.

 18
Author: Wilduck,
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-01-31 21:22:37

Jest to wersja wykorzystująca metodę set_trace() zamiast przestarzałej metody Tracer().

from IPython.core.debugger import Pdb

def my_function():
    x = 5
    Pdb().set_trace()
    print 5
 9
Author: Medhat Omr,
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-08-10 16:18:07

Wewnątrz powłoki IPython, możesz zrobić

from IPython.core.debugger import Pdb
pdb = Pdb()
pdb.runcall(my_function)

Na przykład, lub wykonaj normalną pdb.set_trace() wewnątrz swojej funkcji.

 5
Author: Daniel Roseman,
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-01-31 21:21:43

Zawsze miałem to samo pytanie i najlepszym obejściem, jakie znalazłem, które jest dość hackey, jest dodanie linii, która złamie mój kod, w ten sposób:

...
a = 1+2
STOP
...

Potem jak uruchomię ten kod to się zepsuje i mogę zrobić %debug aby tam wejść i sprawdzić. Możesz również włączyć %pdb, aby zawsze przejść do punktu, w którym łamie się kod, ale może to być uciążliwe, jeśli nie chcesz sprawdzać wszędzie i za każdym razem, gdy łamie się kod. Chciałbym bardziej eleganckie rozwiązanie.

 5
Author: dvreed77,
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-16 16:39:51