【问题标题】:What is the right way to debug in iPython notebook?在 iPython notebook 中调试的正确方法是什么?
【发布时间】:2015-12-01 07:05:16
【问题描述】:

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

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

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

【问题讨论】:

  • 太糟糕了,回答“不要使用 Jupyter notebook”不算作回答

标签: python python-2.7 jupyter-notebook ipython pdb


【解决方案1】:

你可以在 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_traceset_trace() 调用断点。来源:davidhamann.de/2017/04/22/debugging-jupyter-notebooks
  • 方便地用作一条线,在任何需要的地方:from IPython.core.debugger import set_trace;set_trace()
【解决方案2】:

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

可用命令的完整列表: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 新手...看来它更适合演示和共享代码 sn-ps...我们能否拥有 IDE(如 eclipse、rstudio)提供的功能,例如实际调试、步骤通过,断点,给表达式和变量加watch等等。一开始好像不是这样的,只是想确定一下.....
【解决方案3】:

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

breakpoint()

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

【讨论】:

  • 要添加到这一点,当您调用 breakpoint() 时,您可以在出现的文本框中键入“帮助”以获取命令列表。
  • 使用 breakpoint() 或 pdb 后似乎一直存在挂机问题:github.com/ipython/ipython/issues/10516
【解决方案4】:

你的return函数在def函数(main函数)的一行,你必须给它一个tab。 并使用

%%debug 

而不是

%debug 

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

【讨论】:

    【解决方案5】:

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

    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)
    

    【讨论】:

    • @Rex 不一定。 ipdb 是与 IPython 更紧密集成的 Python 调试器的重构。 pdb 是内置的。
    • ipdb 也可以在 ipython shell 之外使用,并带有一些便利,例如 tab 补全。
    【解决方案6】:

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

    【讨论】:

    • 太棒了!
    • 但是,这必须等待异常发生,我们可能想通过设置一些断点来测试运行时中的变量是什么
    【解决方案7】:

    只需在 jupyter notebook 中输入import pdb,然后使用这个cheatsheet 进行调试。很方便。

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

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

    一些有用的截图:

    【讨论】:

    • 好答案。但是,我认为(我是 Jupyter 笔记本的新手)应该添加 %debug 来设置断点。
    • 我所做的是将pdb.set_trace() 复制并粘贴到我想设置断点的位置,因为b line_no 在 Jupyter Notebook 中不起作用,并且在 python IDLE 上运行良好。
    • 谢谢!我还上传了一些我今天测试的截图。如果我可以切换到 Python IDLE,我很乐意这样做..
    • 另外,我找到了一种在 jupyter notebook 上显示行号的方法,点击新行,然后按 l。当然你也可以编写自己的快捷方式,链接可以在 jupyter notebook 网站上找到。
    • 我总是使用“p”来显示 Jupyter 笔记本中的命令列表。当我写“显示行号”时,该命令出现在那里,旁边有快捷方式。您还可以学习要使用的命令的快捷方式。
    【解决方案8】:

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

    如果您有要调试的特定行,只需在此处引发异常(通常您已经这样做了!)或使用其他人建议的 %debug 魔术命令。

    【讨论】:

      【解决方案9】:

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

      它还有一个“评估”标签

      【讨论】:

        【解决方案10】:

        本机调试器作为 JupyterLab 的扩展提供。几周前发布,可以通过获取相关扩展以及 xeus-python 内核(尤其是没有 ipykernel 用户熟知的魔法)来安装它:

        jupyter labextension install @jupyterlab/debugger
        conda install xeus-python -c conda-forge
        

        这实现了其他 IDE 众所周知的可视化调试体验。

        来源:A visual debugger for Jupyter

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        相关资源
        最近更新 更多