Print current call stack from a method in code

PythonDebuggingStack Trace

Python Problem Overview


In Python, how can I print the current call stack from within a method (for debugging purposes).

Python Solutions


Solution 1 - Python

Here's an example of getting the stack via the traceback module, and printing it:

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

If you really only want to print the stack to stderr, you can use:

traceback.print_stack()

Or to print to stdout (useful if want to keep redirected output together), use:

traceback.print_stack(file=sys.stdout)

But getting it via traceback.format_stack() lets you do whatever you like with it.

Solution 2 - Python

import traceback
traceback.print_stack()

Solution 3 - Python

inspect.stack() returns the current stack rather than the exception traceback:

import inspect
print inspect.stack()

See https://gist.github.com/FredLoney/5454553 for a log_stack utility function.

Solution 4 - Python

for those who need to print the call stack while using pdb, just do

(Pdb) where

Solution 5 - Python

If you use python debugger, not only interactive probing of variables but you can get the call stack with the "where" command or "w".

So at the top of your program

import pdb

Then in the code where you want to see what is happening

pdb.set_trace()

and you get dropped into a prompt

Solution 6 - Python

Here's a variation of @RichieHindle's excellent answer which implements a decorator that can be selectively applied to functions as desired. Works with Python 2.7.14 and 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())

Output from sample:

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

Solution 7 - Python

Install Inspect-it

pip3 install inspect-it --user

Code

import inspect;print(*['{:40}| {}:{}\n'.format(x.function, x.filename, x.lineno) for x in inspect.stack()])

you can Make a snippet of this line

it will show you a list of the function call stack with a filename and line number

list from start to where you put this line

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiononeselfView Question on Stackoverflow
Solution 1 - PythonRichieHindleView Answer on Stackoverflow
Solution 2 - PythonMark RoddyView Answer on Stackoverflow
Solution 3 - PythonFred LoneyView Answer on Stackoverflow
Solution 4 - PythonmouseratView Answer on Stackoverflow
Solution 5 - PythonKeirView Answer on Stackoverflow
Solution 6 - PythonmartineauView Answer on Stackoverflow
Solution 7 - PythonMohitGhodasaraView Answer on Stackoverflow