根据我的阅读,有两种方法可以在Python中调试代码:
使用传统的调试器,如pdb
或ipdb
.这支持诸如c
for continue
,n
for step-over
,s
for step-into
等命令,但是你没有直接访问IPython shell,这对于对象检查非常有用.
使用 IPython的通过嵌入代码中的一个IPython的壳.您可以这样做from ipython import embed
,然后embed()
在您的代码中使用.当您的程序/脚本命中一个embed()
语句时,您将被放入一个IPython shell中.这允许使用所有IPython好东西对对象进行全面检查并测试Python代码.但是,在使用时,embed()
您无法使用便捷的键盘快捷键逐步完成代码.
有没有办法结合两全其美?即
这种类型的"增强调试"的一个例子可以在MATLAB中找到,用户总是可以完全访问MATLAB引擎/ shell,她仍然可以逐步完成代码,定义条件断点等.我与其他用户讨论的内容,这是人们在从MATLAB迁移到IPython时最想念的调试功能.
我不想让问题太具体,但我主要在Emacs工作,所以我想知道是否有任何方法可以将此功能纳入其中.理想情况下,Emacs(或编辑器)将允许程序员在代码的任何位置设置断点,并与解释器或调试器通信以使其停在您选择的位置,并在该位置引入完整的IPython解释器.
所以我正在运行一个Python脚本,在其中我通过编写调用Python的调试器PDB:
import ipdb; ipdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
(iPython的PDB版本,虽然我认为它不会产生影响;我只将其用于彩色输出).
现在,当我到调试器时,我想执行多行语句,例如if子句或for循环,但是一旦我输入
if condition:
Run Code Online (Sandbox Code Playgroud)
并点击返回键,我收到错误信息 *** SyntaxError: invalid syntax (<stdin>, line 1)
如何在PDB中执行多行语句?如果不可能有一种解决方法仍然执行if子句或for循环?
据我所知,%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
Run Code Online (Sandbox Code Playgroud)
我尝试了什么:
我试着设置%debug
在cell-1的第一行.但它甚至在执行cell-2之前立即进入调试模式.
我试图%debug
在代码之前添加行return do_some_thing_about(b)
.但随后代码永远运行,永不停止.
在ipython笔记本中设置断点的正确方法是什么?
只是一个方便的问题.我在Visual Studio和XCode等IDE中使用调试器有点被宠坏了.我发现必须键入import pdb; pdb.set_trace()
设置断点有点笨拙(我宁愿不在文件顶部导入pdb,因为我可能会忘记并将其保留).
是否有一种更简单的方法在Python代码中设置断点,与您在IDE中看到的一样简单明了?
我正在使用pdb模块来调试程序.我想了解如何退出pdb并允许程序继续完成.该程序运行起来计算成本很高,因此我不希望在没有脚本尝试完成的情况下退出.continue
似乎不起作用.如何退出pdb并继续我的程序?
nosetests --pdb
让我停止错误或失败,但这对我的需求来说已经太迟了.在执行期间单步执行代码可帮助我调试问题所在.
但是,nosetests是有用的,因为它们允许依赖于相对导入的测试(即在包中进行测试).
如何在执行测试之前设置断点?目前我正在使用:
python -m pdb /path/to/my/nosetests testfile.py
Run Code Online (Sandbox Code Playgroud)
这种解决方案是不够的.Nosetests干扰pdb输出,我的键盘控制(例如箭头键)被破坏.
使用import pdb; pdb.set_trace()似乎是一个好主意,但是nosetests阻止了我对pdb控制台的访问.
对于我的调试需求,pdb
非常好.然而,这将是很大冷却器(和有益的),如果我能进入ipython
.这件事有可能吗?
无论好坏,我的代码充斥着单字母变量(它是物理学的东西,所以这些字母是有意义的),以及NumPy,我经常与之互动.
在使用Python调试器时,偶尔我会想看看比如说的值n
.但是,当我点击时n<enter>
,这是PDB命令(n)ext
,具有更高的优先级. print n
看看它,但我怎么设置它?
如何跳过循环使用pdb.set_trace()
?
例如,
pdb.set_trace()
for i in range(5):
print(i)
print('Done!')
Run Code Online (Sandbox Code Playgroud)
pdb
在循环之前提示.我输入一个命令.返回所有1-5个值,然后我希望pdb
在print('Done!')
执行之前再次提示.