11

レシピsys.excepthookで説明されているようにの動作をカスタマイズしようとしています。

ipythonの場合:

:import pdb, sys, traceback
:def info(type, value, tb):
:    traceback.print_exception(type, value, tb)
:    pdb.pm()
:sys.excepthook = info
:--
>>> x[10] = 5
-------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
NameError: name 'x' is not defined
>>>

pdb.pm()呼び出されていません。sys.excepthook = info私のPython2.5インストールでは機能しないようです。

4

5 に答える 5

22

あなたがこれを書いてから 5 年経った今でも、IPython はこのように動作するので、これをグーグルで調べている人には解決策が役立つかもしれません。

IPython はsys.excepthookコード行を実行するたびに置換されるため、sys.excepthook をオーバーライドしても効果はありません。さらに、IPython は を呼び出すsys.excepthookことさえせず、すべての例外をキャッチし、そこまで到達する前にそれらを処理します。

IPython の実行中に例外ハンドラーをオーバーライドするには、シェルのshowtracebackメソッドにモンキーパッチを適用できます。たとえば、通常の Python トレースバックのように見えるものをオーバーライドする方法を次に示します (IPython の冗長さが気に入らないため)。

def showtraceback(self, *args, **kwargs):
    traceback_lines = traceback.format_exception(*sys.exc_info())
    del traceback_lines[1]
    message = ''.join(traceback_lines)
    sys.stderr.write(message)

import sys
import traceback
import IPython
IPython.core.interactiveshell.InteractiveShell.showtraceback = showtraceback

これは、通常の端末コンソールと Qt コンソールの両方で機能します。

于 2015-02-27T05:49:38.313 に答える
14

通常の Python 対話型シェルの代わりに使用している ipython は、すべての例外をそれ自体でトラップし、sys.excepthook を使用しません。ipython -pdbjust の代わりにas を実行するipythonと、excepthook を使用して実行しようとしているのと同じように、キャッチされていない例外が発生したときに pdb が自動的に呼び出されます。

于 2009-08-11T18:18:53.350 に答える
0

このSOの質問を参照しsitecustomize.pyて、インタラクティブモードでのデバッグを妨げるものがないことを確認してください。

于 2009-08-11T17:33:45.923 に答える