Pythonでは、メソッド内から現在の呼び出しスタックをどのように印刷できますか(デバッグ目的)。
traceback モジュールを使用してスタックを取得し、出力する例を次に示します。
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():
スタックをstderrにのみ印刷する場合は、次を使用できます。
traceback.print_stack()
または、stdoutに出力するには(リダイレクトされた出力をまとめて保持する場合に便利です)、次を使用します。
traceback.print_stack(file=sys.stdout)
ただし、traceback.format_stack()
を介して取得すると、好きなことを実行できます。
import traceback
traceback.print_stack()
inspect.stack()
は、例外トレースバックではなく現在のスタックを返します。
import inspect
print inspect.stack()
Log_stackユーティリティ関数については、 https://Gist.github.com/FredLoney/545455 を参照してください。
pythonデバッガーを使用すると、変数の対話型プローブだけでなく、「where」コマンドまたは「w」で呼び出しスタックを取得できます。
だからあなたのプログラムの一番上に
import pdb
次に、何が起こっているのかを見たいコードで
pdb.set_trace()
プロンプトにドロップされます
インストールInspect-it
pip3 install inspect-it --user
コード
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()])
この行のスニペットを作成できます
関数呼び出しスタックのリストとファイル名と行番号が表示されます
最初からこの行を置く場所までのリスト
@RichieHindleの優れた回答のバリエーションは、必要に応じて機能に選択的に適用できるデコレータを実装しています。 Python 2.7.14および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())
サンプルからの出力:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42