7

Python ドキュメントから:

sys.excepthook(type, value, traceback)

この関数は、特定のトレースバックと例外を に出力しsys.stderrます。

例外が発生してキャッチされない場合、インタープリターはsys.excepthook、例外クラス、例外インスタンス、およびトレースバック オブジェクトの 3 つの引数を使用して呼び出します。対話型セッションでは、これは制御がプロンプトに戻る直前に発生します。Python プログラムでは、これはプログラムが終了する直前に発生します。このようなトップレベルの例外の処理は、別の 3 つの引数関数を に割り当てることによってカスタマイズできますsys.excepthook

http://docs.python.org/library/sys.html

これをグローバルに変更して、デフォルトのアクションが常に呼び出されるようにするにはどうすればよいpdbですか? 変更できる構成ファイルはありますか? これを行うためにコードをラップしたくありません。

4

3 に答える 3

21

必要なものはこちら

http://ynniv.com/blog/2007/11/debugging-python.html

3 つの方法があります。最初の方法は単純ですが粗雑です ( Thomas Heller ) - 以下を site-packages/sitecustomize.py に追加します。

import pdb, sys, traceback
def info(type, value, tb):
    traceback.print_exception(type, value, tb)
    pdb.pm()
sys.excepthook = info

2番目はより洗練されており、クックブックからインタラクティブモードをチェックします(インタラクティブモードでのデバッグを奇妙なことにスキップします):

# code snippet, to be included in 'sitecustomize.py'
import sys

def info(type, value, tb):
   if hasattr(sys, 'ps1') or not sys.stderr.isatty():
      # we are in interactive mode or we don't have a tty-like
      # device, so we call the default hook
      sys.__excepthook__(type, value, tb)
   else:
      import traceback, pdb
      # we are NOT in interactive mode, print the exception...
      traceback.print_exception(type, value, tb)
      print
      # ...then start the debugger in post-mortem mode.
      pdb.pm()

sys.excepthook = info

そして 3 つ目 (stdin または stderr がリダイレクトされない限り、常にデバッガーを開始します) はynnivによるものです。

# code snippet, to be included in 'sitecustomize.py'
import sys

def info(type, value, tb):
   if (#hasattr(sys, "ps1") or
       not sys.stderr.isatty() or 
       not sys.stdin.isatty()):
       # stdin or stderr is redirected, just do the normal thing
       original_hook(type, value, tb)
   else:
       # a terminal is attached and stderr is not redirected, debug 
       import traceback, pdb
       traceback.print_exception(type, value, tb)
       print
       pdb.pm()
       #traceback.print_stack()

original_hook = sys.excepthook
if sys.excepthook == sys.__excepthook__:
    # if someone already patched excepthook, let them win
    sys.excepthook = info
于 2009-08-06T07:27:07.777 に答える
1

もう1つのオプションは、ipythonを使用することです。これは、とにかくPython開発者にとって必須のツールだと思います。シェルからスクリプトを実行する代わりに、%runを使用してipythonからスクリプトを実行します。例外が発生した場合は、%debugと入力してデバッグできます。(発生した例外を自動的にデバッグするオプションもありますが、それが何であるかを忘れています。)

于 2009-08-26T17:48:08.450 に答える
0

試す:

import pdb
import sys

def excepthook(type, value, traceback):
    pdb.post_mortem(traceback)

excepthook.old = sys.excepthook
sys.excepthook = excepthook

def raise_exception():
    raise_exception()

raise_exception()
于 2009-08-06T07:31:43.417 に答える