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ą.
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
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.
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
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.
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.
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