在 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_trace
和 set_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/Jupyter Notebooks 中显示行号