在iPython Notebook中进行调试的正确方法是什么?


121

我所知, %debug magic可以在一个单元内进行调试。

但是,我有跨多个单元格的函数调用。

例如,

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. 我试图%debug在cell-1的第一行中设置。但是它甚至在执行单元2之前就立即进入调试模式。

  2. 我试图%debug在代码之前添加该行return do_some_thing_about(b)。但是,代码将永远运行,永远不会停止。

在ipython笔记本中设置断点的正确方法是什么?

Answers:


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 2015年

@Rex对我来说有效。您将ipdb放在哪里?把导入ipdb; ipdb.set_trace(); 在该行之前返回do_some_thing_about(b)。然后,从第二个单元格调用fun1(a),它将起作用。要退出调试提示,请使用“ c”
Tevin Joseph KO

@Rex更新了答案以更清楚。
Tevin Joseph KO 2015年

29
这在iPython控制台中有效,但在iPython笔记本中无效(这是问题所在)。当我import ipdb; ipdb.set_trace()在笔记本单元格中键入内容时,它会说MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill

1
jupyter的新功能...似乎更适合演示和共享代码片段...我们是否可以拥有IDE(例如eclipse,rstudio)提供的功能,例如实际调试,遍历,断点,在表达式中添加watch和起初,似乎并非如此,只是要确保....
Mahesha999,2017年

90

您可以ipdb在jupyter内部使用以下命令:

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 '17

1
方便在任何需要的地方用作一条线:from IPython.core.debugger import set_trace;set_trace()
Nir

15

您的返回函数位于def函数(主函数)的行中,您必须给它一个制表符。和使用

%%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 2015年

1
@Rex不一定。ipdb是与IPython更紧密集成的Python调试器的重构。pdb是内置的。
两位方士

ipdb也可以在ipython shell外部使用,并提供一些便利,例如制表符补全。
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 pdb在jupyter笔记本,然后用这个的cheatsheet调试。非常方便

c->继续,s->步进,b 12->在第12行设置断点,依此类推。

一些有用的链接: pdb上的Python官方文档Python pdb调试器示例,以更好地了解如何使用调试器命令

一些有用的屏幕截图: 在此处输入图片说明在此处输入图片说明


好答案。但是,我认为(我是Jupyter笔记本电脑的新手)应该添加%debug来设置断点。
Ad Infinitum

我要做的是复制并粘贴pdb.set_trace()到我要设置断点的位置,因为b line_no不能在Jupyter Notebook中正常工作,并且在python IDLE上工作良好。
flowera

谢谢!我还上传了一些今天测试的屏幕截图。如果我可以切换到Python IDLE,我将愿意这么做
。– flowera

另外,我找到了一种在jupyter笔记本上显示行号的方法,单击换行,然后按l。当然您也可以编写自己的快捷方式,在jupyter笔记本网站上提供了链接。
flowera

1
我总是使用“ p”来显示Jupyter笔记本中的命令列表。当我写“显示行号”时,该命令将出现在其旁边的快捷方式中。您还可以了解要使用的命令的快捷方式。
Ad Infinitum's

8

得到错误后,在下一个单元格中运行%debug,仅此而已。


1
太棒了!
某人

但是,这必须等待异常发生,我们可能想通过设置一些断点来在运行时测试变量是什么
Luk Aron

7

%pdb魔术的命令是很好用为好。只需说一遍%pdb on,随后pdb调试器将在所有异常上运行,无论调用堆栈中有多深。非常便利。

如果您有要调试的特定行,只需在此处引发一个异常(通常您已经!),或使用%debug其他人一直在建议的magic命令。


5

我刚刚发现了PixieDebugger。甚至以为我还没有时间进行测试,这似乎确实是调试我们在ipdb中使用ipython的方式的最相似方法

在此处输入图片说明

它还有一个“评估”标签


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.