Druk de huidige call-stack af vanuit een methode in Python-code

Hoe kan ik in Python de huidige aanroepstack afdrukken vanuit een methode (voor foutopsporingsdoeleinden).


Antwoord 1, autoriteit 100%

Hier is een voorbeeld van het verkrijgen van de stapel via de traceback-module en deze af te drukken:

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():

Als u de stapel echt alleen naar stderr wilt afdrukken, kunt u het volgende gebruiken:

traceback.print_stack()

Of om af te drukken naar stdout (handig als u de omgeleide uitvoer bij elkaar wilt houden), gebruik:

traceback.print_stack(file=sys.stdout)

Maar als je het via traceback.format_stack()krijgt, kun je ermee doen wat je wilt.


Antwoord 2, autoriteit 30%

import traceback
traceback.print_stack()

Antwoord 3, autoriteit 14%

inspect.stack()geeft de huidige stack terug in plaats van de uitzondering traceback:

import inspect
print inspect.stack()

Zie https://gist.github.com/FredLoney/5454553voor een log_stack-hulpprogramma functie.


Antwoord 4, autoriteit 9%

voor degenen die de call-stack moeten afdrukken terwijl ze pdb gebruiken, doe dat gewoon

(Pdb) where

Antwoord 5, autoriteit 5%

Als u python debugger gebruikt, kunt u niet alleen interactief zoeken naar variabelen, maar kunt u de call-stack krijgen met het “where”-commando of “w”.

Dus bovenaan je programma

import pdb

Vervolgens in de code waar je wilt zien wat er gebeurt

pdb.set_trace()

en je krijgt een prompt


Antwoord 6

Hier is een variatie op het uitstekende antwoord van @RichieHindle, dat een decorateur implementeert die naar wens selectief kan worden toegepast op functies. Werkt met Python 2.7.14 en 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())

Uitvoer van voorbeeld:

test_func() called:
    File "stacktrace_decorator.py", line 28, in <module>
    print(test_func())
42

Antwoord 7

Installeer Inspect-it

pip3 install inspect-it --user

Code

import inspect;print(*['\n\x1b[0;36;1m| \x1b[0;32;1m{:25}\x1b[0;36;1m| \x1b[0;35;1m{}'.format(str(x.function), x.filename+'\x1b[0;31;1m:'+str(x.lineno)+'\x1b[0m') for x in inspect.stack()])

je kunt een fragment van deze regel maken

het toont u een lijst van de functieaanroepstackmet een bestandsnaam en regelnummer

lijst van begin tot waar u deze regel plaatst

Other episodes