iPythonノートブックでデバッグする正しい方法は何ですか?


121

私が知っているように、%debug magic1つのセル内でデバッグを行うことができます。

ただし、複数のセルにわたる関数呼び出しがあります。

例えば、

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

私が試したこと:

  1. %debugcell-1の1行目に設定してみました。ただし、cell-2を実行する前でも、すぐにデバッグモードに入ります。

  2. %debugコードの直前に行を追加しようとしましたreturn do_some_thing_about(b)。しかし、コードは永久に実行され、停止することはありません。

ipythonノートブック内にブレークポイントを設定する正しい方法は何ですか?

回答:


72

ipdbを使用する

経由でインストール

pip install ipdb

使用法:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

nごとに実行するため、および関数にステップインするためs、およびデバッグプロンプトを終了するために使用しますc

使用可能なコマンドの完全なリストについては、https//appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdbは、質問で言及されているサンプルコードを含む他のセルのデバッグプロンプトを表示しません。これでコードは永久に実行し続けます。
レックス

@Rex私にとってはうまくいきます。ipdbはどこに配置しましたか?インポートipdbを入れてください。ipdb.set_trace(); 行の前にdo_some_thing_about(b)を返します。次に、2番目のセルからfun1(a)を呼び出します。デバッグプロンプトを終了するには、「c」を使用します
Tevin Joseph KO

@Rexより明確にするために回答を更新しました。
Tevin Joseph KO

29
これはiPythonコンソールでは機能しますが、iPythonノートブックでは機能しません(これが質問の対象です)。入力するとimport ipdb; ipdb.set_trace()、ノートブックのセル内では述べていますMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
ビル

1
jupyterの新機能...プレゼンテーションやコードスニペットの共有に適しているようです...実際のデバッグ、ステップスルー、ブレークポイント、式への監視の追加など、IDE(eclipse、rstudioなど)が提供する機能を使用できますか。変数など最初は、それだけを確認したい、そうではないようです.....
Mahesha999

90

あなたはipdbjupyterの中で次のように使うことができます:

from IPython.core.debugger import Tracer; Tracer()()

編集:上記の関数はIPython 5.1以降廃止されました。これが新しいアプローチです。

from IPython.core.debugger import set_trace

追加 set_trace()ブレークポイントが必要な場所にします。タイプhelpのためipdbのコマンドの入力フィールドが表示されます。


20
Tracer減価償却されました。これで次のように機能します。ブレークポイントfrom IPython.core.debugger import set_traceset_trace()呼び出します。出典:davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko

1
:必要に応じてどこでも1行として使用するハンディfrom IPython.core.debugger import set_trace;set_trace()
ニール

15

戻り関数はdef関数(メイン関数)の行にあり、1つのタブをそれに与える必要があります。そして使用

%%debug 

の代わりに

%debug 

行だけでなくセル全体をデバッグします。多分これはあなたを助けるでしょう。


12

これはいつでも任意のセルに追加できます。

import pdb; pdb.set_trace()

デバッガーはその行で停止します。例えば:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)

それはipdbである必要がありますか?
Rex

1
@Rex必ずしもそうではありません。ipdbIPythonとより密接に統合されたPythonデバッガーのリファクタリングです。pdb内蔵されています。
2ビットの錬金術

ipdbipythonシェルの外でも使用でき、タブ補完などの便利な機能が付属しています。
1

12

Python 3.7では、breakpoint()関数を使用できます。入力するだけ

breakpoint()

ランタイムを停止したい場所であればどこからでも、同じpdbコマンド(r、c、n、...)を使用したり、変数を評価したりできます。


2
これに追加するには、breakpoint()を呼び出すときに、表示されるテキストボックスに「help」と入力して、コマンドのリストを取得します。
gbeaven

breakpoint()またはpdbを使用した後、ハングアップの永続的な問題があるようです:github.com/ipython/ipython/issues/10516
Dave Liu

8

import pdbjupyter Notebook と入力し、このチートシートを使用してデバッグするだけです。とても便利です。

c->続行、s->ステップ、b 12->行12にブレークポイントを設定します。

いくつかの便利なリンク: Pythonの公式ドキュメントPDBにデバッガコマンドを使用する方法をよりよく理解するためにPythonのPDBデバッガ例

いくつかの便利なスクリーンショット: ここに画像の説明を入力してくださいここに画像の説明を入力してください


いい答えだ。ただし、(Jupyterノートブックを初めて使用する場合)ブレークポイントを設定するには%debugを追加する必要があると思います。
Ad Infininitum

Jupyter Notebookでは機能せず、Python IDLEで適切に機能するpdb.set_trace()ため、私が行うのは、ブレークポイントを設定する場所にコピーアンドペーストすることですb line_no
Flowera

ありがとう!今日テストしたスクリーンショットもいくつかアップロードしました。Python IDLEに切り替えることができれば、そうしたいと思います
。– flowera

また、jupyter Notebookに行番号を表示し、新しい行をクリックしてからlを押す方法も見つけました。もちろん、独自のショートカットをプログラムすることもできます。リンクはjupyter NotebookのWebサイトにあります。
flowera

1
Jupyterノートブックでコマンドのリストを表示するには、常に「p」を使用します。「行番号を表示」と書くと、コマンドの横にショートカットが表示されます。また、使用したいコマンドのショートカットを学ぶこともできます。
Ad Infinitum 2017年

8

エラーが発生した後、次のセルで実行するだけ%debugです。


1
すごいです!
誰かの

ただし、これは例外が発生するまで待機する必要があります。ブレークポイントを設定して、ランタイムの変数をテストすることもできます
Luk Aron

7

%pdb魔法のコマンドは、同様に使用することが良いです。ただ、言う%pdb on、その後とpdbデバッガが呼び出しスタック内どんなに深く、すべての例外上で実行されます。とても便利な。

デバッグしたい特定の行がある場合は、そこで例外を発生させるか(多くの場合、既にそうなっています!)、または%debug他の人々が提案している魔法のコマンドを使用します。



0

ネイティブデバッガーは、JupyterLabの拡張機能として提供されています。数週間前にリリースされました。これは、関連する拡張機能とxeus-pythonカーネル(特にipykernelユーザーによく知られている魔法がありません)を入手することでインストールできます。

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

これにより、他のIDEでよく知られているビジュアルデバッグエクスペリエンスが可能になります。

ここに画像の説明を入力してください

ソース:Jupyterのビジュアルデバッガー


xeus-pythonがWindows 10で実行されません。githubでxeus-pythonの問題を
sergzemsk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.