私はfirefoxでjupyter(またはIpython)ノートブックを使用していますが、セル内のいくつかのpythonコードをデバッグしたいです。 'import ipdb;を使用しています。 ipdb.set_trace() 'ブレークポイントの種類として、たとえば私のセルには次のコードがあります:
a=4
import ipdb; ipdb.set_trace()
b=5
print a
print b
shift + Enterで実行すると、このエラーが発生します。
--------------------------------------------------------------------------
MultipleInstanceError Traceback (most recent call last)
<ipython-input-1-f2b356251c56> in <module>()
1 a=4
----> 2 import ipdb; ipdb.set_trace()
3 b=5
4 print a
5 print b
/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__init__.py in <module>()
14 # You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
15
---> 16 from ipdb.__main__ import set_trace, post_mortem, pm, run, runcall, runeval, launch_ipdb_on_exception
17
18 pm # please pyflakes
/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__main__.py in <module>()
71 # the instance method will create a new one without loading the config.
72 # i.e: if we are in an embed instance we do not want to load the config.
---> 73 ipapp = TerminalIPythonApp.instance()
74 Shell = get_ipython()
75 def_colors = Shell.colors
/home/nnn/anaconda/lib/python2.7/site-packages/traitlets/config/configurable.pyc in instance(cls, *args, **kwargs)
413 raise MultipleInstanceError(
414 'Multiple incompatible subclass instances of '
--> 415 '%s are being created.' % cls.__name__
416 )
417
MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
このコードをブラウザーのjupyterノートブックではなくjupyter qtconsoleで使用すると、同じエラーが表示されます。このエラーの意味とそれを回避するにはどうすればよいですか? pdbデバッガのnext、continueなどのコマンドを使用して、セル内のコードを段階的にデバッグすることは可能ですか?
この問題もあり、jupyterとipdbのバージョンに関連しているようです。
解決策は、ipdbライブラリset_trace
呼び出しの代わりにこれを使用することです。
from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger
ソース: http://devmartin.com/blog/2014/10/trigger-ipdb-within-ipython-notebook/
Jupyter Notebookを使用している場合は、魔法のコマンド "%% debug"でセルを開始します。次に、デバッグセッションをナビゲートするのに役立つipdb行がセルの下部に表示されます。次のコマンドで開始できます。
n-現在の行を実行し、次の行に移動します。
c-次のブレークポイントまで実行を継続します。
すべての変数が新たに割り当てられるように、デバッグを決定するたびにカーネルを再起動してください。各変数の値はipdb行で確認でき、変数を割り当てる行を実行するまで変数が未定義であることがわかりますその変数の値。
%%debug
import pdb
from pdb import set_trace as bp
def function_xyz():
print('before breakpoint')
bp() # This is a breakpoint.
print('after breakpoint')
Tracer()
は非推奨です。
つかいます:
from IPython.core.debugger import set_trace
そして、set_trace()
をブレークポイントが必要な場所に配置します。
from IPython.core.debugger import set_trace
def add_to_life_universe_everything(x):
answer = 42
set_trace()
answer += x
return answer
add_to_life_universe_everything(12)
これはうまく機能し、組み込みのpdbを使用するよりも少し快適になります(構文の強調表示など)。
Jupyterのバージョンは5.0.0で、対応するipythonバージョンは6.1.0です。私は使っている
import IPython.core.debugger
dbg = IPython.core.debugger.Pdb()
dbg.set_trace()
Tracer
は非推奨としてリストされています。
更新:
私は別の答えからメソッドを使用しようとしました https://stackoverflow.com/a/43086430/8019692 以下ですが、エラーが発生しました:
MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
他のセルで定義された関数にブレークポイントを設定し、別のセルで関数を実行できるため、%% debugマジックよりも自分のメソッドの方が好きです。 Jupyter/IPythonは、ブレークポイントが設定されている関数のデバッガーにドロップされ、通常のpdb
コマンドを使用できます。それぞれ自分自身に...
@ lugger1、受け入れられている回答は非推奨です。