在iPython笔记本中进行调试的正确方法是什么?

问题描述 投票:108回答:9

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

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

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

python python-2.7 jupyter-notebook ipython pdb
9个回答
62
投票

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


86
投票

您可以在jupyter中与ipdb一起使用:

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

Edit:自IPython 5.1开始不推荐使用以上功能。这是新方法:

from IPython.core.debugger import set_trace

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


12
投票

您的返回函数在def函数(主函数)的行中,您必须给它一个制表符。和使用

%%debug 

代替

%debug 

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


12
投票

您可以始终在任何单元格中添加它:

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)

7
投票

只需在jupyter笔记本中键入import pdb,然后使用此cheatsheet进行调试。非常方便。

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

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

一些有用的屏幕截图:enter image description hereenter image description here


6
投票

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

如果您有要调试的特定行,只需在此处引发一个异常(通常已经是!),或使用其他人一直在建议的pdb magic命令。


5
投票

在Python 3.7中,您可以使用%debug函数。只需输入

breakpoint()

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


5
投票

出现错误后,在下一个单元格中运行breakpoint() 就这样。


4
投票

我刚刚发现了%debug。甚至以为我还没有时间对其进行测试,这似乎确实是调试我们在ipdb中使用ipython的方式的最相似方法

PixieDebugger

还有一个“评估”标签

© www.soinside.com 2019 - 2024. All rights reserved.