2009-07-20 8 views

答えて

213

ここ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()経由で取得すると、あなたが好きなことをすることができます。

+8

: 'stack_str = '' .join(traceback.format_stack())' – scottmrogowski

+0

他のすべてのスレッド*(Iために同じことを行う方法」私は制御していないスレッドについて話しています)*? – user2284570

+0

多分私はここで何かを見逃しているかもしれませんが、fを呼び出すのはgを呼び出すことだけです。なぜ – Chris

69
import traceback 
traceback.print_stack() 
+6

実際には 'traceback.print_exc()'が好きです。これは 'except'ステートメントなしで得られたものとほとんど同じものを与えます(受け入れられた答えよりもコーディングが少ない)。 – martineau

+22

'traceback.print_exc()'は処理している可能性のある例外についてスタックトレースを出力しますが、これは元の質問を解決しません。これは_current_ stack( "どこにいますか"あなたのコードは、最後の例外があった場合に終了しました。 ") –

20

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

import inspect 
print inspect.stack() 

はlog_stackユーティリティ機能のためhttps://gist.github.com/FredLoney/5454553を参照してください。

8

Pythonデバッガを使用する場合は、対話式プロービングだけでなく、 "where"コマンドまたは "w"を使用してコールスタックを取得できます。あなたのプログラムの先頭

import pdb 

でそう

は、その後、あなたが

pdb.set_trace() 

を何が起こっているかを確認したいとあなたが迅速

+0

私は10年以上Pythonでプログラミングしてきました。私はこれを使うことができたので、何度も!私はちょうど今それについて知っていると信じることができません。 – hosford42

0

中に落としますコードにここにあります@ 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 
関連する問題