22

import pdb; pdb.set_trace()実際に例外をスローする代わりに、python プログラムに対話型デバッガーを起動させる方法はありますか?

これを機能させる難しさは承知していますが、巨大なスタック トレースを使用してブレークポイントを挿入する場所を特定し、プログラムを再起動してデバッグするよりもはるかに価値があります。例外をスローする代わりデバッガーを起動するだけでは意味がないことを知っています。例外はレベルまたは別のレベルでキャッチされる可能性があるためです。スローされます(このリストの例外は実際には「エラー」であり、その後に意味のあるプログラムの動作が続くことはないことがわかっているため)...

Common Lisp にはこのようなものがあると聞いたことがありますが、それがどのように機能するのか正確にはわかりません。「真の Lisp」がそれを大いに賞賛しているだけです...

4

4 に答える 4

18

最も簡単な方法は、次のようにコード全体をtryブロック内にラップすることです。

if __name__ == '__main__':

    try:
        raise Exception()
    except:
        import pdb
        pdb.set_trace()

このレシピsys.excepthookで説明されているように、キャッチされない例外の処理をオーバーライドするため に使用する、より複雑なソリューションがあります。

## {{{ http://code.activestate.com/recipes/65287/ (r5)
# 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
## end of http://code.activestate.com/recipes/65287/ }}}

上記のコードは、Pythonによって自動的にインポートされるinsidedirectorysitecustomize.pyというファイルに含める必要があります。site-packagesデバッガーは、Pythonが非対話型モードで実行されている場合にのみ開始されます。

于 2012-11-01T10:01:01.023 に答える
10

この質問はかなり古いので、これは主に将来の私向けです

try:
    ...
except:
    import traceback, pdb, sys
    traceback.print_exc()
    print ''
    pdb.post_mortem()
    sys.exit(1)
于 2016-06-26T17:47:05.763 に答える
2

例外で pdb を起動するパッケージを作成しました。@boreis-gorelik の回答を受け取り、実行時にインタープリターの状態を変更するため、コードの変更は必要ありません。

インストール

 pip install mort

使用法

mort <file.py or module to execute>

例外が発生すると、指定されたターミナルで pdb repl が開始されます。

于 2018-04-17T04:54:17.930 に答える
1

REPL内にいる場合は、次のことができます

import sys
import pdb
pdb.post_mortem(sys.last_traceback)

https://docs.python.org/2/library/pdb.htmlおよびhttps://docs.python.org/3/library/traceback.htmlを参照してください

于 2016-04-01T15:13:57.990 に答える