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

据我所知,%debug可以在一个单元格内进行调试。

但是,我有跨多个单元格的函数调用。

例如,

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笔记本中设置断点的正确方法是什么?

Rex asked 2019-08-13T17:32:00Z
9个解决方案
83 votes

你可以在jupyter里面使用set_trace()

set_trace()


编辑:自IPython 5.1以来,不推荐使用上述函数。 这是新方法:

set_trace()

添加set_trace(),您需要断点。 输入字段出现时,键入help以获取ipdb命令。

Leopd answered 2019-08-13T17:33:26Z
56 votes

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

Tevin Joseph K O answered 2019-08-13T17:32:36Z
12 votes

你的返回函数符合def函数(主函数),你必须给它一个标签。并使用

%%debug 

代替

%debug 

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

Mohit Khurana answered 2019-08-13T17:34:00Z
8 votes

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

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)
krock answered 2019-08-13T17:34:32Z
7 votes

只需在jupyter笔记本中输入c,然后使用此备忘单进行调试。 这很方便。

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

一些有用的链接:   关于pdb的Python官方文档,Python pdb调试器示例,以便更好地理解如何使用调试器命令。

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

flowera answered 2019-08-13T17:35:21Z
4 votes

%debug魔术命令也很好用。 只需说%debug,随后pdb调试器将在所有异常上运行,无论调用堆栈有多深。 非常便利。

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

waterproof answered 2019-08-13T17:35:55Z
3 votes

在Python 3.7中,您可以使用breakpoint()函数。 输入

breakpoint()

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

Vlad Bezden answered 2019-08-13T17:36:29Z
3 votes

收到错误后,在下一个单元格中运行%debug即可。

Escachator answered 2019-08-13T17:36:56Z
2 votes

我刚刚发现了PixieDebugger。 即使我还没有时间测试它,它似乎是最类似的方式来调试我们在ipython中使用ipdb的方式

enter image description here

它还有一个"评估" 标签

Alessandro Dentella answered 2019-08-13T17:37:32Z
translate from https://stackoverflow.com:/questions/32409629/what-is-the-right-way-to-debug-in-ipython-notebook