Pythonでは、(デバッグ目的のために)メソッド内から現在の呼び出しスタックをどのように印刷できますか?現在の呼び出しスタックを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():
あなたが使用することができます。
traceback.print_stack()
または、標準出力に出力する(出力をリダイレクトする場合に便利):
しかし、traceback.format_stack()
経由で取得すると、あなたが好きなことをすることができます。
import traceback
traceback.print_stack()
実際には 'traceback.print_exc()'が好きです。これは 'except'ステートメントなしで得られたものとほとんど同じものを与えます(受け入れられた答えよりもコーディングが少ない)。 – martineau
'traceback.print_exc()'は処理している可能性のある例外についてスタックトレースを出力しますが、これは元の質問を解決しません。これは_current_ stack( "どこにいますか"あなたのコードは、最後の例外があった場合に終了しました。 ") –
inspect.stack()
現在のスタックではなく、例外のトレースバックを返します。
import inspect
print inspect.stack()
はlog_stackユーティリティ機能のためhttps://gist.github.com/FredLoney/5454553を参照してください。
Pythonデバッガを使用する場合は、対話式プロービングだけでなく、 "where"コマンドまたは "w"を使用してコールスタックを取得できます。あなたのプログラムの先頭
import pdb
でそう
は、その後、あなたが
pdb.set_trace()
を何が起こっているかを確認したいとあなたが迅速
私は10年以上Pythonでプログラミングしてきました。私はこれを使うことができたので、何度も!私はちょうど今それについて知っていると信じることができません。 – hosford42
中に落としますコードにここにあります@ 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
- 1. Javaのメソッド呼び出しスタックのコピー
- 2. 他のオブジェクトからメソッドを呼び出すメソッド呼び出し
- 3. Androidのメソッド呼び出しスタック
- 4. C++コードからクラスのpythonメソッドを呼び出す
- 5. Pythonのメソッド呼び出し
- 6. PythonコードからELFを呼び出す
- 7. PythonからPHPコードを呼び出す
- 8. 現在実行中のコンソールアプリケーションでメソッドを呼び出します。
- 9. Javaメソッド呼び出しのCPU /スタックを制限しますか?
- 10. ライブラリから現在のアプリケーションの適切な終了メソッドを呼び出すか?
- 11. Pythonメソッドを呼び出す
- 12. Pythonを呼び出すメソッド
- 13. コルーチンの呼び出しスタック
- 14. 現在のクラスからメソッドの実装を呼び出す方法は?
- 15. C#:コードからの呼び出し呼び出し階層
- 16. C#でメソッド/呼び出しを別のメソッドから呼び出す方法は?
- 17. 属性呼び出し速度VSメソッド呼び出しPython
- 18. 現在のJSPアプリケーションからJSPアプリケーションを呼び出す
- 19. c#のコードのデバッグと呼び出しスタックを避ける
- 20. Pythonでのメソッド呼び出しのMonkeypatching
- 21. Pyro4リモートオブジェクトのメソッドを永久にスタックして呼び出す。
- 22. NSThreadからの呼び出しメソッド
- 23. ルビーコード "around"呼び出しスタック
- 24. Javaで呼び出されるメソッドのスタックを取得する
- 25. ヘルパーメソッドを呼び出すページのヘルパークラスからメソッドを呼び出します。
- 26. 現在のメソッド呼び出しの実行を停止する方法
- 27. メソッド呼び出しのソースpython
- 28. 整数オブジェクトのPython呼び出しメソッド
- 29. Javaメソッド呼び出しスタックを印刷するには?
- 30. メソッド呼び出しをスタックする方法は?
: 'stack_str = '' .join(traceback.format_stack())' – scottmrogowski
他のすべてのスレッド*(Iために同じことを行う方法」私は制御していないスレッドについて話しています)*? – user2284570
多分私はここで何かを見逃しているかもしれませんが、fを呼び出すのはgを呼び出すことだけです。なぜ – Chris