回答:
traceback.print_excを使用して、例外のトレースバックを出力できます。その後、使用sys.exc_infoをトレースバックを抽出し、最終的に呼び出すためにpdb.post_mortemをそのトレースバックで
import pdb, traceback, sys
def bombs():
a = []
print a[0]
if __name__ == '__main__':
try:
bombs()
except:
extype, value, tb = sys.exc_info()
traceback.print_exc()
pdb.post_mortem(tb)
例外が発生したフレームのローカルを使用して、code.interactでインタラクティブなコマンドラインを開始する場合は、次のことができます
import traceback, sys, code
def bombs():
a = []
print a[0]
if __name__ == '__main__':
try:
bombs()
except:
type, value, tb = sys.exc_info()
traceback.print_exc()
last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb
frame = last_frame().tb_frame
ns = dict(frame.f_globals)
ns.update(frame.f_locals)
code.interact(local=ns)
code
超えるpdb
後者が前者に拡大しているようですので、?
code
ですか?
sys.exc_info
トレースバックを抽出し、最終的に呼び出すためにpdb.post_mortem
そのトレースバックで。トレースバックオブジェクトをに渡す必要はありませんpdb.post_mortem
。ドキュメントから:トレースバックが指定されていない場合は、現在処理されている例外の1つを使用します(デフォルトを使用する場合は、例外を処理する必要があります)。
python -m pdb -c continue myscript.py
-c continue
フラグを指定しない場合は、実行の開始時に 'c'(続行)を入力する必要があります。その後、エラーポイントまで実行され、そこで制御できます。eqzx言及「C」を入力するので、このフラグは、Python 3.2で新たに追加され、以前のPythonのバージョン(参照のために必要とされるhttps://docs.python.org/3/library/pdb.htmlを)。
gdb
。で「r」を入力するとpdb
、プログラムは実際に実行されますが、エラーで停止(またはバックトレースを生成)しません。これを読むまで私は戸惑いました。乾杯!
ipdb
ます。もちろん、引数はスクリプトの後に追加できます。
次のモジュールを使用します。
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() # deprecated
pdb.post_mortem(tb) # more "modern"
sys.excepthook = info
名前を付けてdebug
(または好きな名前を付けて)、Pythonパスのどこかに配置します。
次に、スクリプトの開始時に、を追加しimport debug
ます。
try-catch
醜いIMOでラップしたりする必要はありません。
pudb
オーバーpdb
。私の人生の秩序の欠如について確かに何かを言っているコピー&ペーストに戻ってください。
Ipythonには、この動作を切り替えるためのコマンド%pdbがあります。それはあなたが説明したとおりに、おそらくもう少し(構文の強調表示とコード補完でより有益なバックトレースを提供します)します。ぜひお試しください!
%debug
デバッガを開くことができることに注意してください。私はしばしばこれを好む。(トレードオフは、エラーをデバッグしたくないときは常にタイピングすることと、エラーをデバッグしたいときはいつもタイピングすることです。)%pdb
q
%debug
c.InteractiveShell.pdb = True
が自動的にipython_config.py
オンになることにも注意してください%pdb
。
これはデバッガではありませんが、おそらく同じくらい便利です(?)
グイドがどこかでスピーチの中でこれを言っているのを聞いたのを知っています。
私はpython-?を確認しました。-iコマンドを使用すると、スクリプトが停止した場所を操作できます。
したがって、次のスクリプトがあるとします。
testlist = [1,2,3,4,5, 0]
prev_i = None
for i in testlist:
if not prev_i:
prev_i = i
else:
result = prev_i/i
あなたはこの出力を得ることができます!
PS D:\> python -i debugtest.py
Traceback (most recent call last):
File "debugtest.py", line 10, in <module>
result = prev_i/i
ZeroDivisionError: integer division or modulo by zero
>>>
>>>
>>> prev_i
1
>>> i
0
>>>
正直なところ、これは使用していませんが、使用する必要がありますが、非常に便利です。
IPythonは、コマンドラインでこれを簡単にします。
python myscript.py arg1 arg2
に書き換えることができます
ipython --pdb myscript.py -- arg1 arg2
または、同様に、モジュールを呼び出す場合:
python -m mymodule arg1 arg2
に書き換えることができます
ipython --pdb -m mymodule -- arg1 arg2
--
IPythonがスクリプトの引数を独自のものとして読み取るのを停止することに注意してください。
これには、pdbの代わりに拡張IPythonデバッガー(ipdb)を呼び出すという利点もあります。
最初にcを入力せずに実行するには、次のコマンドを使用します。
python -m pdb -c c <script name>
Pdbには独自のコマンドライン引数があります。-ccは実行の開始時にc(ontinue)コマンドを実行し、プログラムはエラーが発生するまで中断されずに実行されます。
階層の最上位の例外クラスのコンストラクター内にブレークポイントを配置すると、ほとんどの場合、エラーが発生した場所がわかります。
ブレークポイントを置くことは、それが意味することを何でも意味します:IDE、またはpdb.set_trace
、または何でも使用できます