在 iPython notebook 中调试的正确方法是啥?

Posted

技术标签:

【中文标题】在 iPython notebook 中调试的正确方法是啥?【英文标题】:What is the right way to debug in iPython notebook?在 iPython notebook 中调试的正确方法是什么? 【发布时间】:2015-12-01 07:05:16 【问题描述】:

据我所知,%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

我尝试了什么:

    我尝试在 cell-1 的第一行设置%debug。但它会立即进入调试模式,甚至在执行 cell-2 之前。

    我尝试在代码return do_some_thing_about(b) 之前的行中添加%debug。但随后代码将永远运行,永不停止。

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

【问题讨论】:

太糟糕了,回答“不要使用 Jupyter notebook”不算作回答 【参考方案1】:

你可以在 jupyter 中使用ipdb

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

编辑:上述函数自 IPython 5.1 起已弃用。这是新方法:

from IPython.core.debugger import set_trace

在需要断点的地方添加set_trace()。当输入字段出现时,为ipdb 命令键入help

【讨论】:

Tracer 已折旧。现在它以这种方式工作:from IPython.core.debugger import set_traceset_trace() 调用断点。来源:davidhamann.de/2017/04/22/debugging-jupyter-notebooks 方便地用作一条线,在任何需要的地方:from IPython.core.debugger import set_trace;set_trace()【参考方案2】:

使用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。 p>

可用命令的完整列表:https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf

【讨论】:

ipdb 没有在另一个单元格中使用问题中提到的示例代码给我调试提示。现在代码会一直运行下去。 @Rex 对我来说有效。你把ipdb放在哪里了?放进口ipdb; ipdb.set_trace();在行之前返回 do_some_thing_about(b)。然后,从第二个单元格调用 fun1(a),它应该可以工作。退出调试提示使用'c' @Rex 更新了答案以更清晰。 这适用于 iPython 控制台,但不适用于 iPython 笔记本(这是问题所在)。当我在笔记本单元格中输入import ipdb; ipdb.set_trace() 时,它会显示MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created. jupyter 新手...看来它更适合演示和共享代码 sn-ps...我们能否拥有 IDE(如 eclipse、rstudio)提供的功能,例如实际调试、步骤通过,断点,给表达式和变量加watch等等。一开始好像不是这样的,只是想确定一下.....【参考方案3】:

在 Python 3.7 中,您可以使用 breakpoint() 函数。直接输入

breakpoint()

无论您希望运行时在哪里停止,您都可以使用相同的 pdb 命令(r、c、n、...)或评估您的变量。

【讨论】:

要添加到这一点,当您调用 breakpoint() 时,您可以在出现的文本框中键入“帮助”以获取命令列表。 使用 breakpoint() 或 pdb 后似乎一直存在挂机问题:github.com/ipython/ipython/issues/10516【参考方案4】:

你的return函数在def函数(main函数)的一行,你必须给它一个tab。 并使用

%%debug 

而不是

%debug 

调试整个单元格不只是行。希望,也许这会对你有所帮助。

【讨论】:

【参考方案5】:

您可以随时在任何单元格中添加它:

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)

【讨论】:

@Rex 不一定。 ipdb 是与 IPython 更紧密集成的 Python 调试器的重构。 pdb 是内置的。 ipdb 也可以在 ipython shell 之外使用,并带有一些便利,例如 tab 补全。【参考方案6】:

出现错误后,在下一个单元格中运行 %debug 即可。

【讨论】:

太棒了! 但是,这必须等待异常发生,我们可能想通过设置一些断点来测试运行时中的变量是什么【参考方案7】:

只需在 jupyter notebook 中输入import pdb,然后使用这个cheatsheet 进行调试。很方便。

c --> continue,s --> step,b 12 --> 在第 12 行设置断点,依此类推。

一些有用的链接: Python Official Document on pdb, Python pdb debugger examples for better understanding how to use the debugger commands.

一些有用的截图:

【讨论】:

好答案。但是,我认为(我是 Jupyter 笔记本的新手)应该添加 %debug 来设置断点。 我所做的是将pdb.set_trace() 复制并粘贴到我想设置断点的位置,因为b line_no 在 Jupyter Notebook 中不起作用,并且在 python IDLE 上运行良好。 谢谢!我还上传了一些我今天测试的截图。如果我可以切换到 Python IDLE,我很乐意这样做.. 另外,我找到了一种在 jupyter notebook 上显示行号的方法,点击新行,然后按 l。当然你也可以编写自己的快捷方式,链接可以在 jupyter notebook 网站上找到。 我总是使用“p”来显示 Jupyter 笔记本中的命令列表。当我写“显示行号”时,该命令出现在那里,旁边有快捷方式。您还可以学习要使用的命令的快捷方式。【参考方案8】:

%pdb magic command 也很好用。只需说%pdb on,然后pdb 调试器将在所有异常上运行,无论调用堆栈有多深。非常方便。

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

【讨论】:

【参考方案9】:

我刚刚发现PixieDebugger。即使我还没有时间测试它,它似乎真的是最相似的方式来调试我们在 ipython 中使用 ipdb 的方式

它还有一个“评估”标签

【讨论】:

【参考方案10】:

本机调试器作为 JupyterLab 的扩展提供。几周前发布,可以通过获取相关扩展以及 xeus-python 内核(尤其是没有 ipykernel 用户熟知的魔法)来安装它:

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

这实现了其他 IDE 众所周知的可视化调试体验。

来源:A visual debugger for Jupyter

【讨论】:

xeus-python 无法在我的 Windows 10 上运行。请检查我的问题 xeus-python issue on github

以上是关于在 iPython notebook 中调试的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

IPython Notebook 和 Pandas 自动完成

IPython Notebook:代码重用

在 IPython/Jupyter Notebooks 中显示行号

IPython Notebook 抛出 ImportError – IPython 不会

Ipython notebook 小技巧

ipython notebook 安装求助