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

What is the right way to debug in iPython notebook?

据我所知,%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. 我尝试在cell-1的第一行设置%debug。但它会立即进入调试模式,甚至在执行 cell-2 之前。

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

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

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

%%debug 

而不是

%debug 

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

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

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

通过

安装
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

您可以在 jupyter 中使用 ipdb

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

Edit:自 IPython 5.1 以来,上述功能已弃用。这是新方法:

from IPython.core.debugger import set_trace

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

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

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

Some useful links: Python Official Document on pdb, Python pdb debugger examples for better understanding how to use the debugger commands.

Some useful screenshots:

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

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

在Python 3.7中你可以使用breakpoint()功能。只需输入

breakpoint()

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

出现错误后,在下一个单元格中 运行 %debug 就是这样。

我刚刚发现 PixieDebugger。即使我还没有时间测试它,它确实似乎是我们在 ipython 和 ipdb

中使用的调试方式最相似的方式

它还有一个“评估”选项卡

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

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

这实现了其他 IDE 中广为人知的可视化调试体验。

来源:A visual debugger for Jupyter

在VsCode

文件 -> 首选项 -> 设置 -> 打开设置(JSON)[右上角的小页面图标]

将这行代码粘贴到末尾

"jupyter.experimental.debugging": true

现在您应该会在顶部导航栏看到调试选项