6

最近、ipython0.10からipython0.11に切り替えました。ipython0.11では、Pythonデバッガーが関与しているとき(つまり、を使用しているとき%pdb)に完全なトレースバックの小さなスニペットしか表示されませんが、ipython0.10では完全なトレースバックが表示されます。私の知る限り、完全なトレースバックにはpdbコマンドラインから直接アクセスすることはできません。「u」を使用してナビゲートすることはできますが、直接表示することはできません。

それで、完全なトレースバックを表示する方法はありますか?構成パラメータなど?

または、さらに便利なことに、コード内のどこでキャッチされたかを表示するのではなく、ipythonにキャッチされた例外を表示させる方法はありますか?

編集:例:

In [1]: pdb
Automatic pdb calling has been turned ON

In [2]: 1/0
> <ipython-input-2-05c9758a9c21>(1)<module>()
     -1 1/0

ipdb> q
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
/Users/adam/<ipython-input-2-05c9758a9c21> in <module>()
----> 1 1/0

ZeroDivisionError: integer division or modulo by zero

pdbを終了する にZeroDivisionErrorを確認したいと思います。q

4

1 に答える 1

6

コード内のどこでキャッチされたかを表示するのではなく、ipythonにキャッチされた例外を表示させる方法はありますか?

あなたが使用することができますsys.excepthook

import sys

def exc_hook(type, value, traceback):
    print type

sys.excepthook = exc_hook

sysモジュールのドキュメントから:

sys.excepthook(type, value, traceback)

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

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

sys.__displayhook__
sys.__excepthook__

これらのオブジェクトには、プログラムの開始時にdisplayhookとexcepthookの元の値が含まれています。それらは、壊れたオブジェクトに置き換えられた場合にdisplayhookとexcepthookを復元できるように保存されます。


--xmodeオプションをに設定してipythonを起動してみることもできますPlain

IPythonリファレンスから:

$ ipython [options] files

--xmode=<modename>

例外報告のモード。

有効なモード:プレーン、コンテキスト、および詳細。

プレーン:Pythonの通常のトレースバック印刷に似ています。

コンテキスト:トレースバックの各行の周囲に5行のコンテキストソースコードを出力します。

Verbose:Contextに似ていますが、例外が発生した場所で現在表示されている変数を追加で出力します(長すぎる場合は文字列を短くします)。文字列表現の計算が複雑な巨大なデータ構造がある場合、これは非常に遅くなる可能性があります。CPU使用率が100%の場合、コンピュータがしばらくフリーズするように見えることがあります。これが発生した場合は、Ctrl-Cを使用してトレースバックをキャンセルできます(複数回ヒットする可能性があります)。

使用例を次に示します。各トレースバックの行の違いに注意してください。

--xmode=Plain

[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py 
------------------------------------------------------------
Traceback (most recent call last):
  File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module>
    1 / 0
ZeroDivisionError: integer division or modulo by zero

--xmode=Context

[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py 
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
      1 
----> 2 #!/usr/bin/python
      3 1 / 0
      4 
      5 

ZeroDivisionError: integer division or modulo by zero

--xmode=Verbose

[ 19:54 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py 
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
      1 
----> 2 #!/usr/bin/python
      3 1 / 0
      4 
      5 

ZeroDivisionError: integer division or modulo by zero

そして、.pyファイルを指定せずに:

--xmode=Plain

[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain

In [1]: 1 / 0
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

--xmode=Context

[ 20:03 jon@hozbox ~/SO/python ]$ ipython --xmode=Context

In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/<ipython console> in <module>()

ZeroDivisionError: integer division or modulo by zero

--xmode=Verbose

[ 20:01 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose


In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/<ipython console> in <module>()

ZeroDivisionError: integer division or modulo by zero

Pythonデバッガーを使用します

于 2011-11-03T00:12:22.957 に答える