web-dev-qa-db-ja.com

print pythonスタックトレースが例外なしで発生する

クラスのインスタンス変数の1つで何かが起こっています。変数をプロパティにしたいのですが、変数にアクセスするたびに、その時点までのすべてのコードのスタックトレースを出力して、どこがいじられているのかを確認したいと思います。例外が発生していないときにスタックトレースを出力するにはどうすればよいですか?例外があるかどうかはわかっていますが、traceback.format_tb(sys.exc_info()[2])のようなことができます。

また、最初のいくつかはおそらくそれほど面白くないので、最後の3〜4レベルのみを印刷することも役立つでしょう。

61
Claudiu

traceback.print_stack()

_>>> def f():
...   def g():
...     traceback.print_stack()
...   g()
...
>>> f()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in f
  File "<stdin>", line 3, in g
_

編集: extract_stack を使用してスライス(例:最初の5つのレベルを除外する場合は_stack[5:]_)を使用し、 format_list を使用して印刷可能なスタックトレースを取得することもできます( '\n'.join(traceback.format_list(...))

80
user395760

Stdoutに出力する代わりに、ロガーに渡す文字列が必要な場合は、次を使用できます。

''.join(traceback.format_stack())

Traceback.format_stack()はスタックトレースをフォーマットされた文字列のリストとして返すため、好きなようにスライスできることに注意してください。スタックトレースの最後のいくつかの要素を取得するには、次のようにします。

''.join(traceback.format_stack()[-N:])

ここで、Nは関心のあるレベルの数です。

4
rouble