web-dev-qa-db-ja.com

Python with IPythonのブレークポイント誘導インタラクティブデバッグ

IPythonセッションがあり、そこからスクリプトを呼び出すとします。

_> run my_script.py
_

_my_script.py_にブレークポイントを誘導して、IPythonからワークスペースを検査する方法はありますか?

以前のバージョンのIPythonでできることを読んだことを覚えています。

_from IPython.Debugger import Tracer;     

def my_function():
    x = 5
    Tracer()
    print 5;
_

しかし、サブモジュールDebuggerはもう利用できないようです。

IPythonセッションが既に開いていると仮定します。どのようにしてプログラムを選択した場所で停止し、IPythonでワークスペースを検査できますか

一般に、上記のTracer()の呼び出しを複数回行い、行番号を追跡する必要がないため、行番号を事前に指定する必要のないソリューションを好むでしょう。彼らはどこにいますか。

33

Tracer()はipythonの別のモジュールにまだ存在しています。次のことができます。

_from IPython.core.debugger import Tracer

def my_function():
    x = 5
    Tracer()()
    print 5
_

Tracerを囲む追加の呼び出し括弧に注意してください。

edit:IPython 6以降の場合Tracer非推奨 したがって、set_trace()を使用する必要があります代わりに:

_from IPython.core.debugger import set_trace

def my_function():
    x = 5
    set_trace()
    print 5
_
29
pankaj

あなたはそれを実行し、与えられた行にブレークポイントを設定することができます:

run -d -b12 myscript

-b12は12行目にブレークポイントを設定します。この行に入ると、すぐにpdbにドロップし、cと入力してそのブレークポイントまで実行する必要があります。

20
Wilduck

これは、非推奨のset_trace()メソッドの代わりにTracer()メソッドを使用したバージョンです。

from IPython.core.debugger import Pdb

def my_function():
    x = 5
    Pdb().set_trace()
    print 5
12
Medhat Omr

IPythonシェル内では、次のことができます

_from IPython.core.debugger import Pdb
pdb = Pdb()
pdb.runcall(my_function)
_

たとえば、または関数内で通常のpdb.set_trace()を実行します。

6
Daniel Roseman

私はいつも同じ質問をしてきましたが、私が見つけた最高の回避策は、かなりコードが壊れる行を追加することです:

...
a = 1+2
STOP
...

その後、そのコードを実行すると壊れます。%debugを実行すると、そこに移動して検査できます。また、%pdbをオンにして、常にコードが破損する箇所を指すようにすることもできますが、どこでも、コードが破損するたびに検査したくない場合、これは面倒です。もっとエレガントなソリューションが欲しいです。

5
dvreed77