web-dev-qa-db-ja.com

Pythonコードのメソッドから現在の呼び出しスタックを出力します

Pythonでは、メソッド内から現在の呼び出しスタックをどのように印刷できますか(デバッグ目的)。

244
oneself

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()を介して取得すると、好きなことを実行できます。

279
RichieHindle
import traceback
traceback.print_stack()
86
Mark Roddy

inspect.stack()は、例外トレースバックではなく現在のスタックを返します。

import inspect
print inspect.stack()

Log_stackユーティリティ関数については、 https://Gist.github.com/FredLoney/545455 を参照してください。

33
Fred Loney

pythonデバッガーを使用すると、変数の対話型プローブだけでなく、「where」コマンドまたは「w」で呼び出しスタックを取得できます。

だからあなたのプログラムの一番上に

import pdb

次に、何が起こっているのかを見たいコードで

pdb.set_trace()

プロンプトにドロップされます

13
Keir

インストール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()])

この行のスニペットを作成できます

関数呼び出しスタックのリストとファイル名と行番号が表示されます

最初からこの行を置く場所までのリスト

1
MohitGhodasara

@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
0
martineau