python中notebook左侧in中_关于python:在iPython Notebook中进行调试的正确方法是什么?...

本文讨论了如何在iPython Jupyter Notebook中进行调试,特别是当涉及多单元格函数调用时。介绍了如何设置断点,使用%debug、set_trace()以及ipdb模块。还提到了在不同单元格间调试的问题,以及一些用户反馈的解决方案和经验分享。
摘要由CSDN通过智能技术生成

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

c4305f99c2a7e2919b001a8e94f80527.png

af68df31b4a662403978532a401b1237.png

好答案。但是,我认为(我是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的方式的最相似方法

787a9af190b17a7329017816251f0255.png

它还有一个"评估"标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值