据我所知,%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。 但是它甚至在执行单元2之前就立即进入调试模式。
我试图在代码return do_some_thing_about(b)之前的行中添加%debug。 但是然后代码永远运行,永不停止。
在ipython笔记本中设置断点的正确方法是什么?
您可以在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
使用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)。然后,从第二个单元格调用fun1(a),它应该可以工作。要退出调试提示,请使用c
@Rex更新了答案以更清楚。
这在iPython控制台中有效,但在iPython笔记本中无效(这是问题所在)。当我在笔记本单元格中键入import ipdb; ipdb.set_trace()时,它说MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
jupyter的新功能...似乎更适合演示和共享代码片段...我们是否可以拥有IDE(例如eclipse,rstudio)提供的功能,例如实际调试,遍历,断点,在表达式中添加watch和起初,似乎并非如此,只是要确保.....
对我来说很奇怪。似乎有时但并非每次都起作用。而且,如果您忘记正确退出调试器,则可以将其保持在阻塞状态并被迫重新启动内核。绝对不是理想的解决方案...
您的返回函数在def函数(主函数)的行中,您必须给它一个制表符。
和使用
%%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吗?
@Rex不一定。 ipdb是Python调试器的重构,它与IPython紧密集成。 pdb是内置的。
ipdb也可以在ipython shell之外使用,并提供一些便利,例如制表符补全。
收到错误后,在下一个单元格中运行%debug即可。
太棒了!
%pdb magic命令也很好用。只需说%pdb on,随后pdb调试器将在所有异常上运行,无论调用堆栈中有多深。非常便利。
如果您有要调试的特定行,只需在其中引发一个异常(通常已经是!),或使用其他人一直在建议的%debug magic命令。
只需在jupyter笔记本中键入import pdb,然后使用此备忘单进行调试即可。非常方便
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:
好答案。但是,我认为(我是Jupyter笔记本电脑的新手)应该添加%debug来设置断点。
我要做的是将pdb.set_trace()复制并粘贴到我要设置断点的位置,因为b line_no在Jupyter Notebook中不起作用,并且在python IDLE上运行良好。
谢谢!我还上传了一些我今天测试过的屏幕截图。如果我可以切换到Python IDLE,我将很乐意这样做。
另外,我找到了一种在jupyter笔记本上显示行号的方法,单击新行,然后按l。当然,您也可以编写自己的快捷方式,链接可在jupyter笔记本网站上找到。
我总是使用" p"来显示Jupyter笔记本中的命令列表。当我编写"显示行号"时,该命令将出现在其旁边的快捷方式中。您还可以了解要使用的命令的快捷方式。
在Python 3.7中,您可以使用breakpoint()函数。只需输入
breakpoint()
无论您想在哪里停止运行时,都可以使用相同的pdb命令(r,c,n,...)或评估变量。
除此之外,在调用breakpoint()时,您可以在出现的文本框中键入help以获得命令列表。
在使用breakpoint()或pdb之后似乎仍然存在挂断的持久性问题:github.com/ipython/ipython/issues/10516
我刚刚发现了PixieDebugger。甚至以为我还没有时间进行测试,这似乎确实是调试我们在ipdb中使用ipython的方式的最相似方法
它还有一个"评估"标签