2012-01-26 23 views
4

私は現在のスタックフレームをすべて取得しようとしており、各フレームの各フレームに対して何らかの検査をしていますf_globalsこれは、私の場合例外がスローされていないことを除いて、モジュールがそれを行う方法と非常に似ています。 traceback.extract_stack()はこれにアクセスできませんが、例外がスローされた場合はsys.exc_info()のフレームが行います。 (それはNoneになるまで)現在のすべてのスタックフレームのf_globals属性にアクセスするにはどうすればいいですか

答えて

3

inspectモジュールの "stack"機能を使用してください。各フレームのオブジェクトにf_globalsを検査する

[frame, filename, line number, function name, frame sources, current line index in sources] 

>>> import inspect 
>>> inspect.stack() 
[(<frame object at 0x02467FE0>, '<stdin>', 1, '<module>', None, None)] 

この呼び出しは、各要素は(Python docsに従って)そのフレームに実行されているフレームと、余分な情報からなるタプルであるリストを、得られます:

>>> for frame_tuple in inspect.stack(): 
... print frame_tuple[0].f_globals.keys() 
... 
['frame_tuple', '__builtins__', 'inspect', '__package__', '__name__', 'readline', 'rlcompleter', '__doc__'] 

「スタック」機能は、実走行物事を設定する以外のコード、またはデバッグに使用されるように、しかし、遅いです。変数値やその他のイントロスペクションベースのコードを取得するなど、ランタイム操作のためにスタックを検査する必要がある場合は、現フレームを取得するのにinspect.currentframe()を使用し、前のフレームへのリンクについて各フレームに.f_backプロパティを使用してください。

sys._getframeを使用しないでください。名前の先頭にあるアンダースコアは、一般向けではないためです。

2
current_frame = sys._getframe(0) 

その後、スタックを歩いてf_back属性を使用することができます。

これはCPython固有のものであり、実装の詳細とみなされていることに注意してください。

関連する問題