据我所知,%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的第一行中设置%debug
。但是它甚至在执行单元2之前就立即进入调试模式。
我试图在代码%debug
之前的行中添加return do_some_thing_about(b)
。但是,代码将永远运行,永远不会停止。
在ipython笔记本中设置断点的正确方法是什么?
使用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
您可以在jupyter中与ipdb
一起使用:
from IPython.core.debugger import Tracer; Tracer()()
Edit:自IPython 5.1开始不推荐使用以上功能。这是新方法:
from IPython.core.debugger import set_trace
在需要断点的位置添加set_trace()
。出现输入字段时,为help
命令键入ipdb
。
您的返回函数在def函数(主函数)的行中,您必须给它一个制表符。和使用
%%debug
代替
%debug
调试整个单元,不仅行。希望,也许这会对您有所帮助。
您可以始终在任何单元格中添加它:
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)
只需在jupyter笔记本中键入import pdb
,然后使用此cheatsheet进行调试。非常方便。
[c
->继续,s
->步进,b 12
->在第12行设置断点,依此类推。
一些有用的链接:Python Official Document on pdb,Python pdb debugger examples for better understanding how to use the debugger commands。
%pdb
magic command也很好用。只需说%pdb
,随后%pdb on
调试器将在所有异常上运行,无论调用堆栈中有多深。非常方便。
如果您有要调试的特定行,只需在此处引发一个异常(通常已经是!),或使用其他人一直在建议的pdb
magic命令。
出现错误后,在下一个单元格中运行breakpoint()
就这样。