我正在尝试在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()
在命令后面的行中设置断点,但两者都会导致相同的问题(我认为,实际上是确切的同样的事情)。
我还尝试了%debug
(MultipleInstanceError
)和%%debug
(不显示正在执行的行中的代码 - 只是说明了哪一行,使用s
没有'进入该功能,只需运行该行。
编辑:事实证明,根据今年4月的博客文章,普通pdb
也应该有效。它允许我以交互方式调试笔记本,但它只打印正在调试的当前行(可能不是bug),它与IPython的set_trace()
和Tracer()()
在普通的IPython
控制台上,IPython的set_trace
(我测试的只有一个)工作得很好。
答案 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'
现在我可以使用&#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)
希望这有助于有人完全解决问题。