W języku Python, w jaki sposób mogę wydrukować bieżący stos wywołań z metody (w celu debugowania).Drukuj bieżący stos wywołań z metody w kodzie Python
Odpowiedz
Oto przykład na uzyskanie stosu poprzez moduł traceback i drukowanie go:
import traceback
def f():
g()
def g():
for line in traceback.format_stack():
print(line.strip())
f()
# Prints:
# File "so-stack.py", line 10, in <module>
# f()
# File "so-stack.py", line 4, in f
# g()
# File "so-stack.py", line 7, in g
# for line in traceback.format_stack():
Jeśli naprawdę tylko chcesz wydrukować stos na stderr, można użyć:
traceback.print_stack()
lub wydrukować na standardowe wyjście (przydatne, jeśli chce zachować przekierowany razem), zastosowanie:
traceback.print_stack(file=sys.stdout)
Ale uzyskanie go przez traceback.format_stack()
pozwala ci robić, co chcesz z tym.
import traceback
traceback.print_stack()
Właściwie, lubię 'traceback.print_exc()', które daje prawie to samo, co dostałeśby bez instrukcji 'except' (i jest również mniej kodowania niż zaakceptowana odpowiedź). – martineau
'traceback.print_exc()' wyświetla ślad stosu dla dowolnego wyjątku, który może być obsługiwany - ale to nie rozwiązuje pierwotnego pytania, które polega na drukowaniu stosu _current_ ("gdzie teraz jesteś" w przeciwieństwie do "gdzie Twój kod był, gdy ostatni wyjątek wyszedł, jeśli w ogóle ".) –
inspect.stack()
zwraca bieżące stos zamiast stosie z wyjątek:
import inspect
print inspect.stack()
Patrz https://gist.github.com/FredLoney/5454553 dla funkcji użytkowych log_stack.
Jeśli używasz debuggera python, nie tylko interaktywne sondowanie zmiennych, ale możesz uzyskać stos wywołań za pomocą komendy "where" lub "w".
Więc na początku programu
import pdb
następnie w kodzie, w którym chcesz, aby zobaczyć co się dzieje
pdb.set_trace()
i zrzucane do szybkiego
Programuję w Pythonie od ponad dekady. Są * tak * wiele razy mogłem tego użyć! Nie mogę uwierzyć, że właśnie się o tym dowiedziałem. – hosford42
Oto odmiana doskonałej odpowiedzi @ RichieHindle, która implementuje dekorator, który można selektywnie zastosować do funkcji według potrzeb. Działa z Python 2.7.14 i 3.6.4.
from __future__ import print_function
import functools
import traceback
import sys
INDENT = 4*' '
def stacktrace(func):
@functools.wraps(func)
def wrapped(*args, **kwds):
# Get all but last line returned by traceback.format_stack()
# which is the line below.
callstack = '\n'.join([INDENT+line.strip() for line in traceback.format_stack()][:-1])
print('{}() called:'.format(func.__name__))
print(callstack)
return func(*args, **kwds)
return wrapped
@stacktrace
def test_func():
return 42
print(test_func())
Wyjście z próbką:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
- 1. Drukuj stos wywołań PHP
- 2. Jak mogę uzyskać stos wywołań w Clojure?
- 3. Jak uzyskać pełny stos wywołań z Valgrind?
- 4. Javascript debug w Firefoksie: jak wyświetlić stos wywołań z błędem
- 5. Wyświetl stos wywołań w aplikacji Delphi Win32
- 6. Control.EndInvoke resetuje stos wywołań dla wyjątku
- 7. Uzyskaj stos wywołań z dowolnego wątku w C
- 8. Nodejs RangeError Maksymalny stos wywołań przekroczył
- 9. Brak stosu wywołań w wyjątku w kodzie X 4
- 10. Natywny stos wywołań Windbg nie ma sensu
- 11. Metody wywoływania wywołań Java
- 12. drukuj adres pamięci zmiennej Python
- 13. Stos vs. Stert w JavaScript? (Przekroczono maksymalny rozmiar stosu wywołań)
- 14. Instalowanie modułu python w kodzie
- 15. Przekroczono maksymalny stos wywołań podczas tworzenia klasy wewnątrz modułu
- 16. Jak uzyskać bieżący model z niestandardowej metody w laravel
- 17. Bieżący przykład lub działająca demonstracja wzorca interfejsu w kodzie JavaScript
- 18. Drukuj zamieszanie
- 19. Metody wywołań za pomocą wzoru jQuery Plugin
- 20. Głęboki może stos z takodem
- 21. Niezbilansowany stos!
- 22. Co robi "drukuj >>" w pythonie?
- 23. Drukuj i pexpect logowanie
- 24. Szyny: metoda wywołania metody link_to wywołań w kontrolerze
- 25. Datetime bieżący rok i miesiąc python
- 26. drukuj pływa w ada
- 27. grep - drukuj wiersz wcześniej, nie drukuj mecz
- 28. Magnific popup: Pobierz bieżący element w oddzwonieniu
- 29. Obliczanie wartości maksymalnej w kodzie IL
- 30. Python Metody statyczne, dlaczego?
Jako wyrażenie: 'stack_str = '' .join (traceback.format_stack())' – scottmrogowski
Jak zrobić to samo dla wszystkich innych wątków * (I” m mówienie o wątkach, których nie kontroluję) *? – user2284570
Może brakuje mi tutaj czegoś, ale nazywasz f, którego jedynym celem jest tutaj wywołanie g i nie robi nic innego. Dlaczego – Chris