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

Rex*_*Rex 110 python ipython python-2.7 pdb jupyter-notebook

据我所知,%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
Run Code Online (Sandbox Code Playgroud)

我尝试了什么:

  1. 我试着设置%debug在cell-1的第一行.但它甚至在执行cell-2之前立即进入调试模式.

  2. 我试图%debug在代码之前添加行return do_some_thing_about(b).但随后代码永远运行,永不停止.

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

Leo*_*opd 88

您可以ipdb在jupyter里面使用:

set_trace()


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

help

添加ipdb需要断点的位置.键入ipdb用于set_trace()命令输入字段出现时.

  • `Tracer`被折旧了.现在它以这种方式工作:`来自IPython.core.debugger import set_trace`和`set_trace()`唤起一个断点.资料来源:https://davidhamann.de/2017/04/22/debugging-jupyter-notebooks/ (18认同)
  • 在需要的地方可以方便地作为一行使用:`from IPython.core.debugger import set_trace;set_trace()` (2认同)

Tev*_*K O 63

使用ipdb

通过安装它

pip install ipdb
Run Code Online (Sandbox Code Playgroud)

用法:

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)
Run Code Online (Sandbox Code Playgroud)

对于逐行执行n和步骤进入函数使用s并退出调试提示使用c.

有关可用命令的完整列表:https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf

  • 这适用于iPython控制台,但不适用于iPython笔记本(这就是问题所在).当我输入`import ipdb; ipdb.set_trace()`在一个笔记本单元格中,它说`MultipleInstanceError:正在创建TerminalIPythonApp的多个不兼容的子类实例. (26认同)
  • jupyter 的新手……似乎它更适合演示和共享代码片段……我们是否可以拥有 IDE(如 eclipse、rstudio)提供的功能,例如实际调试、单步执行、断点、向表达式添加监视以及变量等。一开始好像不是这样,只是想确定一下..... (2认同)

小智 13

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

%%debug 
Run Code Online (Sandbox Code Playgroud)

代替

%debug 
Run Code Online (Sandbox Code Playgroud)

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


kro*_*ock 11

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

import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

并且调试器将在该行停止.例如:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)
Run Code Online (Sandbox Code Playgroud)


flo*_*era 7

只需键入import pdb在jupyter笔记本,然后用这个的cheatsheet调试.这很方便.

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

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

一些有用的截图: 在此输入图像描述在此输入图像描述


wat*_*oof 7

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

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


Vla*_*den 6

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

breakpoint()
Run Code Online (Sandbox Code Playgroud)

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

  • 此外,当您调用 breakpoint() 时,您可以在出现的文本框中键入“help”以获取命令列表。 (3认同)
  • 使用breakpoint()或pdb后似乎存在持续的挂起问题:https://github.com/ipython/ipython/issues/10516 (2认同)

Esc*_*tor 6

得到错误后,在下一个单元格中运行%debug,仅此而已。


Ale*_*lla 6

我刚刚发现PixieDebugger。还以为我还没来得及测试它,它似乎真的是调试我们在ipython中使用ipdb使用的方式最相似的方式

在此处输入图片说明

它还有一个“评估”选项卡