Jawaban:
Berikut adalah contoh mendapatkan tumpukan melalui modul traceback , dan mencetaknya:
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():
Jika Anda benar-benar hanya ingin mencetak tumpukan ke stderr, Anda dapat menggunakan:
traceback.print_stack()
Atau untuk mencetak ke stdout (berguna jika ingin menyimpan hasil yang dialihkan bersamaan), gunakan:
traceback.print_stack(file=sys.stdout)
Tetapi mendapatkannya melalui traceback.format_stack()
memungkinkan Anda melakukan apa pun yang Anda suka dengannya.
sys._current_frames()
. Misalnya py_better_exchookdump_all_thread_tracebacks
melakukan itu (penafian: saya menulis itu).
import traceback
traceback.print_stack()
traceback.print_exc()
yang memberi Anda hal yang hampir sama dengan yang Anda dapatkan tanpa except
pernyataan (dan juga lebih sedikit coding daripada jawaban yang diterima).
traceback.print_exc()
mencetak jejak tumpukan untuk pengecualian apa pun yang mungkin Anda tangani - tetapi ini tidak menyelesaikan pertanyaan awal, yaitu bagaimana cara mencetak tumpukan saat ini ("di mana Anda sekarang" sebagai lawan "di mana kode Anda berada saat pengecualian terakhir terjadi off, jika ada ".)
inspect.stack()
mengembalikan tumpukan saat ini daripada traceback pengecualian:
import inspect
print inspect.stack()
Lihat https://gist.github.com/FredLoney/5454553 untuk fungsi utilitas log_stack.
Jika Anda menggunakan python debugger, tidak hanya variabel interaktif penyelidikan tetapi Anda bisa mendapatkan tumpukan panggilan dengan perintah "where" atau "w".
Jadi di bagian atas program Anda
import pdb
Kemudian dalam kode tempat Anda ingin melihat apa yang terjadi
pdb.set_trace()
dan Anda masuk ke prompt
where
?
(pdb)
ketik saja where
dan itu akan mencetak jejak tumpukan ke terminal.
breakpoint()
yang meniadakan kebutuhan untuk mengimpor pdb.
Berikut variasi jawaban istimewa dari RichieHindle yang mengimplementasikan dekorator yang dapat diterapkan secara selektif ke fungsi yang diinginkan. Bekerja dengan Python 2.7.14 dan 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 dari sampel:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Instal Inspect-it
pip3 install inspect-it --user
Kode
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()])
Anda dapat membuat cuplikan dari baris ini
itu akan menunjukkan kepada Anda daftar tumpukan panggilan fungsi dengan nama file dan nomor baris
daftar dari awal ke tempat Anda meletakkan baris ini