问题:在iPython 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
我试过的
我试图
%debug
在cell-1的第一行中设置。但是它甚至在执行单元2之前就立即进入调试模式。我试图
%debug
在代码之前添加该行return do_some_thing_about(b)
。但是,代码将永远运行,永远不会停止。
在ipython笔记本中设置断点的正确方法是什么?
回答 0
使用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
回答 1
您可以ipdb
在jupyter内部使用以下命令:
from IPython.core.debugger import Tracer; Tracer()()
编辑:自IPython 5.1起,不推荐使用上述功能。这是新方法:
from IPython.core.debugger import set_trace
set_trace()
在需要断点的地方添加。键入help
用于ipdb
命令输入字段出现时。
回答 2
您的返回函数位于def函数(主函数)的行中,您必须给它一个制表符。和使用
%%debug
代替
%debug
调试整个单元而不仅仅是行。希望这可能对您有帮助。
回答 3
您始终可以在任何单元格中添加它:
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)
回答 4
回答 5
只需键入import pdb
在jupyter笔记本,然后用这个的cheatsheet调试。非常方便
c
->继续,s
->步进,b 12
->在第12行设置断点,依此类推。
回答 6
得到错误后,在下一个单元格中运行%debug
,仅此而已。
回答 7
在%pdb on
,随后pdb
调试器将在所有异常上运行,无论调用堆栈中有多深。非常便利。
如果您有要调试的特定行,只需在此处引发一个异常(通常您已经!),或使用%debug
其他人一直在建议的magic命令。
回答 8
回答 9
提供了本机调试器作为JupyterLab的扩展。可以在几周前发布,可以通过获取相关扩展以及xeus-python内核(尤其是没有ipykernel用户众所周知的魔术)来安装它:
jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge
这样可以实现其他IDE众所周知的可视化调试体验。