Yanıtlar:
İşte yığını geri izleme modülü üzerinden alma ve yazdırma örneği :
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():
Yığını yalnızca stderr'a yazdırmak istiyorsanız, şunu kullanabilirsiniz:
traceback.print_stack()
Veya stdout'a yazdırmak için (yeniden yönlendirilmiş çıktıyı bir arada tutmak istiyorsanız yararlıdır) kullanın:
traceback.print_stack(file=sys.stdout)
Ama üzerinden geçmek, onunla traceback.format_stack()
ne istersen yapmana izin verir.
sys._current_frames()
. Örneğin py_better_exchookdump_all_thread_tracebacks
bunu yapar (feragatname: Bunu ben yazdım).
import traceback
traceback.print_stack()
traceback.print_exc()
hangi except
ifadeyi almadan alacağınızla aynı şeyi verir (ve aynı zamanda kabul edilen cevaptan daha az kodlama yapar).
traceback.print_exc()
işleyebileceğiniz herhangi bir istisna için yığın izini yazdırır - ancak bu, geçerli yığının nasıl yazdırılacağı anlamına gelmez; kapalı, varsa ".)
inspect.stack()
istisna izleme yerine geçerli yığını döndürür:
import inspect
print inspect.stack()
Bir log_stack yardımcı programı işlevi için bkz. Https://gist.github.com/FredLoney/5454553 .
Eğer python hata ayıklayıcı kullanıyorsanız, sadece değişkenlerin interaktif problaması değil, aynı zamanda çağrı yığınını "where" komutu veya "w" ile alabilirsiniz.
Programınızın en üstünde
import pdb
Sonra neler olduğunu görmek istediğiniz kodda
pdb.set_trace()
ve bir istemin içine düştün
where
?
(pdb)
sadece tipini where
ve terminale yığın izlemesini yazdırır.
breakpoint()
pdb alma ihtiyacını ortadan kaldıran yerleşik bir işleve sahiptir.
@ RichieHindle'ın fonksiyonlara istendiği gibi seçici olarak uygulanabilen bir dekoratörü uygulayan mükemmel cevabının bir varyasyonu. Python 2.7.14 ve 3.6.4 ile çalışır.
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())
Numune çıktısı:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Inspect-it'i yükleyin
pip3 install inspect-it --user
kod
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()])
bu satırın bir pasajını yapabilirsiniz
size dosya adı ve satır numarası ile fonksiyon çağrısı yığınının bir listesini gösterecektir
Başlangıçtan bu satırı nereye koyacağınıza