调试器在Jupyter笔记本上运行不正常

时间:2017-09-29 18:51:48

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

我正在尝试在Jupyter笔记本中调试一些代码。我已经尝试了 3 4种不同的方法,它们都遇到了同样的问题:

--Return--
None
> <ipython-input-22-04c6f5c205d1>(3)<module>()
      1 import IPython.core.debugger as dbg
      2 dber = dbg.Tracer()
----> 3 dber()
      4 tst = huh.plot(ret_params=True)
      5 type(tst)

ipdb> n
> y:\miniconda\lib\site-packages\ipython\core\interactiveshell.py(2884)run_code()
   2882             finally:
   2883                 # Reset our crash handler in place
-> 2884                 sys.excepthook = old_excepthook
   2885         except SystemExit as e:
   2886             if result is not None:

正如您所看到的,n命令,从我对pdb文档中的理解应该执行下一行(我假设ipdb只是pdb适用于IPython,特别是因为我找不到任何专门针对ipdb而不是pdb的命令文档。

s也有同样的问题。这实际上就是我想做的事情 - 进入plot调用(根据我的理解,这是s应该做的事情),但我得到的与我得到的完全相同来自n。我也尝试了r,我也遇到了同样的问题。

我见过的每个例子都使用Tracer()()IPython.core.debugger.PDB().set_trace()在命令后面的行中设置断点,但两者都会导致相同的问题(我认为,实际上是确切的同样的事情)。

我还尝试了%debugMultipleInstanceError)和%%debug(不显示正在执行的行中的代码 - 只是说明了哪一行,使用s没有'进入该功能,只需运行该行。

编辑:事实证明,根据今年4月的博客文章,普通pdb也应该有效。它允许我以交互方式调试笔记本,但它只打印正在调试的当前行(可能不是bug),它与IPython的set_trace()Tracer()()

有同样的问题

在普通的IPython控制台上,IPython的set_trace(我测试的只有一个)工作得很好。

1 个答案:

答案 0 :(得分:3)

我在Jupyter Notebook中调试时遇到了同样的问题。然而,对我来说有用的是当我在函数中调用set_trace()时。为什么在这里解释(click),虽然我不太明白为什么其他人不会遇到这个问题。无论如何,如果你需要一个实用的解决方案来解决你的问题,并且你想调试一个自编函数,试试这个:

from IPython.core.debugger import set_trace

def thisfunction(x):
    set_trace()        # start debugging when calling the function
    x += 2
    return x

thisfunction(5)        # ipdb console opens and I can use 'n'

enter image description here

现在我可以使用&#39; n&#39;调试过程运行下一行没有问题。但是,如果我使用以下代码,则会遇到上述问题。

from IPython.core.debugger import set_trace

def thisfunction(x):
    x += 2
    return x

set_trace()            # start debugging before calling the function. 
                       # Calling 's' in the ipdb console to step inside "thisfunction" produces an error
thisfunction(5)        

enter image description here

希望这有助于有人完全解决问题。