In Python, how can I print the current call stack from within a method (for debugging purposes).
7 Answers
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.

- 4,691
- 2
- 29
- 41

- 272,464
- 47
- 358
- 399
-
How to do the same for all other threads *(I’m talking about threads I don’t control)* ? – user2284570 Feb 10 '17 at 03:40
-
Maybe I'm missing something here, but you call f which it's only purpose is here is to call g and does nothing else. Why – Chris Apr 27 '17 at 03:37
-
8@Chris: It's just an example. It has multiple functions to make it clear that format_stack() prints all the calls on the stack. – RichieHindle Apr 27 '17 at 06:09
-
If you want to get some more verbose output (including vars etc), see [this related question](https://stackoverflow.com/questions/1308607/python-assert-improved-introspection-of-failure), and [this one](https://stackoverflow.com/questions/36088160/traceback-print-stack-using-ipythons-ultratb). – Albert Oct 07 '18 at 12:47
-
@user2284570: You can use `sys._current_frames()`. E.g. [py_better_exchook `dump_all_thread_tracebacks`](https://github.com/albertz/py_better_exchook/) does that (disclaimer: I wrote that). – Albert Oct 07 '18 at 12:50
-
Is there any concern of having production code relying on traceback.format_stack()? – CodingFanSteve Jan 27 '20 at 05:07
-
Why do we need f()? Can't we just call g()? – skittlebiz Dec 20 '22 at 23:25
import traceback
traceback.print_stack()

- 27,122
- 19
- 67
- 71
-
8Actually, I like `traceback.print_exc()` which gives you almost the same thing you would have gotten without the `except` statement (and is also less coding than the accepted answer). – martineau Nov 04 '10 at 19:23
-
47`traceback.print_exc()` prints the stack trace for any exception that you might be handling - but this does not solve the original question, which is how to print the _current_ stack ("where you are now" as opposed to "where your code was when the last exception went off, if any".) – Tom Swirly Feb 27 '13 at 22:42
-
2It may be useful to limit the trace to a number of entries, e.g.: traceback.print_stack(limit=4) – Davy Feb 03 '21 at 09:20
for those who need to print the call stack while using pdb, just do
(Pdb) where

- 1,565
- 13
- 9
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.

- 861
- 6
- 4
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

- 557
- 1
- 6
- 17
-
2I've been programming in Python for over a decade. There are *so* many times I could have used this! I can't believe I'm just now finding out about it. – hosford42 Apr 14 '17 at 15:42
-
3
-
4To answer the "where" part of the question: After you get the pdb prompt `(pdb) ` just type `where` and it will print the stack trace to the terminal. – stephenmm Oct 10 '18 at 17:08
-
1Python 3.7 and above have a builtin function `breakpoint()` which obviates the need to import pdb. – user650654 Jun 12 '19 at 23:43
-
A note for anyone who tries this out in a jupyter notebook: enter exit() into the prompt to get the cell to finish executing. – Sherman Mar 11 '22 at 01:59
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

- 119,623
- 25
- 170
- 301
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

- 2,342
- 1
- 22
- 29