Wie kann ich in Python den aktuellen Aufruf-Stack innerhalb einer Methode (zu Debugging-Zwecken) drucken?Aktuellen Aufrufstack aus einer Methode in Python-Code drucken
Antwort
Hier ist ein Beispiel für den Stapel über das traceback Modul bekommen, und drucken:
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():
Wenn Sie wirklich nur den Stapel ausdrucken möchten, in stderr Sie verwenden können:
traceback.print_stack()
Oder um auf stdout zu drucken (nützlich, wenn die umgeleitete Ausgabe zusammen beibehalten werden soll), verwenden Sie:
traceback.print_stack(file=sys.stdout)
Aber über traceback.format_stack()
können Sie damit machen, was Sie wollen.
import traceback
traceback.print_stack()
Eigentlich mag ich 'traceback.print_exc()', was Ihnen fast das gleiche gibt, was Sie ohne die 'except'-Anweisung bekommen hätten (und ist auch weniger codierend als die akzeptierte Antwort). – martineau
'traceback.print_exc()' druckt den Stack-Trace für jede Exception, die Sie bearbeiten könnten - aber das löst nicht die ursprüngliche Frage, wie der _current_ stack ("wo Sie jetzt sind" im Gegensatz zu "where") gedruckt wird Ihr Code war, wenn die letzte Ausnahme ausging, falls überhaupt. " –
inspect.stack()
gibt den aktuellen Stapel und nicht die Ausnahme Zurückverfolgungs:
import inspect
print inspect.stack()
Siehe https://gist.github.com/FredLoney/5454553 für eine log_stack Nutzenfunktion.
Wenn Sie Python-Debugger verwenden, nicht nur interaktives Sondieren von Variablen, aber Sie können den Aufruf-Stack mit dem "wo" -Befehl oder "w" erhalten.
So an der Spitze des Programms
import pdb
dann in dem Code, wo Sie sehen wollen, was
pdb.set_trace()
und Sie in eine Eingabeaufforderung
Ich habe seit über einem Jahrzehnt in Python programmiert. Es gibt * so * viele Male hätte ich das benutzen können! Ich kann nicht glauben, dass ich gerade erst davon erfahren habe. – hosford42
erhalten fallen gelassen geschieht hier ein Variation von @ RichieHindles ausgezeichneter Antwort, die einen Dekorator implementiert, der selektiv auf Funktionen wie gewünscht angewendet werden kann. Funktioniert mit Python 2.7.14 und 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())
Ausgabe von Beispiel:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
- 1. Drucken vollständige Signatur einer Methode aus einer MethodInfo
- 2. Erlang Aufrufstack
- 3. C++ Aufrufstack von std :: exception
- 4. Zugriff auf den Java-Aufrufstack
- 5. Wie aus einer Liste in Reihenfolge drucken?
- 6. Name der aktuellen Datei in Swift drucken
- 7. Mit einer Methode aus einer anderen Klasse
- 8. Den aktuellen Typ in einer statischen, generischen Methode abrufen?
- 9. Break in einer Methode aus einer Schleife
- 10. GORM refresh() -Methode nicht immer aktuellen Daten aus der Datenbank
- 11. Drucken aller Werte einer Variablen aus einer Wiederholungsschleife in Netlogo
- 12. Drucken von Stichwörtern aus einer Liste
- 13. Python - Drucken von Zeilen aus einer Datei
- 14. Drucken eines Wertes aus einer String-Variablen
- 15. mehrere Zeilen aus einer Parsing-Schleife drucken
- 16. Anzahl der Elemente aus einer Datendatei drucken
- 17. Pretty-Drucken eines Datensatzes mit einer benutzerdefinierten Methode in Clojure
- 18. Erstellen Sie ein Objekt aus der aktuellen Klasse in einer statischen Methode - PHP
- 19. Drucken von Daten aus einer $ watch Eingabe
- 20. Drucken eines aus einer Textdatei erstellten Arrays
- 21. Wie nächstes Jahr vom aktuellen Jahr in Python drucken
- 22. So drucken Sie mehrere Zeilen aus einer Datei Python
- 23. kann nicht von einer anderen Klasse nicht statische Methode drucken
- 24. Codeigniter: Aufruf einer Methode aus einer Sicht
- 25. Beste Methode zum Drucken. NET-Quellcode
- 26. php Drucken einer Textvariablen aus einer Curl-Funktion
- 27. Erstellen einer JVM aus einer JNI-Methode
- 28. Drucken von Elementen aus Tabellen in einer Datenbank, Rails
- 29. Scala - Drucken bestimmter Felder in jeder Zeile aus einer Datei
- 30. C/C++ - Code, der den Aufrufstack beschädigt
Als string: 'stack_str = '' .join (traceback.format_stack())' – scottmrogowski
Wie das gleiche für alle anderen Threads tun * (I‘ Ich spreche über Threads, die ich nicht kontrolliere) *? – user2284570
Vielleicht verpasse ich hier etwas, aber du rufst f an, es ist nur Zweck, hier ist g anzurufen und tut nichts anderes. Warum – Chris