默认情况下,在IPython中调试期间,ipdb在代码中显示当前位置上方的一行和一行。
是否有一种简单的方法可以使区域显示更大?我认为它是可配置的,但一直无法找到它。
答案 0 :(得分:38)
您可以在ipdb中键入l
以显示当前上下文的几行
你可以继续点击l
并继续显示文件中的更多行
如果要在当前行周围显示更多上下文行,可以键入l
以获取当前行。然后输入l curr_line - 10, curr_line + 10
。说我在第50行,我想看到周围的20行。我会输入:l 40,60
以查看更多信息。
正如@jrieke在评论中指出的那样,你也可以点击ll
来获得更大的上下文。关于ll
的一个好处是它会从当前方法的开头一直打印出来(而连续的l
会在断点下面显示更多的行)。
答案 1 :(得分:14)
您可以通过以下方式获得更多背景信息:
ipdb.set_trace(context=21)
(0.10.0中引入的a bug打破了这一点,但应尽快修复)
要永久设置上下文大小,请执行
查找安装目录python -c 'import ipdb; print(ipdb)'
将显示__init__.py
个文件。打开该文件并找到该行(也可以在IPDB的__main__.py
:
def set_trace(frame=None, context=3):
将3
更改为您想要的多个上下文行。
答案 2 :(得分:12)
好的,我在IPython源代码中找到了这个地方。在我的安装中,它位于
.../python2.7/site-packages/ipython-0.10.2-py2.7.egg/IPython/Debugger.py:327:
改变这个:
def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
context = 3):
到
def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
context = 11):
太棒了!
对于IPython 4.0.1,在debugger.py中添加:
class Pdb(OldPdb):
"""Modified Pdb class, does not load readline."""
def __init__(self,color_scheme='NoColor',completekey=None,
stdin=None, stdout=None, context=None):
context=20
答案 3 :(得分:3)
从 IPython 7.21 开始,您可以在 ipdb 中使用 context
命令来更改显示的回溯行数:
import ipdb; ipdb.set_trace()
...
ipdb> context 10
ipdb> bt
您可以在 ~/.ipdb
中添加以下行以让 ipdb 自动设置它:
context = 10
除此之外,context=
中还有旧的 set_trace()
参数,可以在运行调试器时对其进行设置:
import ipdb; ipdb.set_trace(context=10)
# or, if you've set PYTHONBREAKPOINT=ipdb.set_trace in your environment
breakpoint(context=10)
答案 4 :(得分:1)
作为对https://stackoverflow.com/a/35883288/895245的快速补充,这通常是您要添加到要调试的代码中的一个衬里:
__import__('ipdb').set_trace(context=21)
您可能想从编辑器中为其添加快捷方式,例如对于Vim snipmat,我有:
snippet ipd
__import__('ipdb').set_trace(context=21)
所以我只能输入ipd<tab>
,它会扩展到断点。然后dd
删除它很容易,因为所有内容都包含在一行中。
答案 5 :(得分:1)
这是一个补丁,可为您的程序永久设置上下文:
(适用于set_trace和post_mortem)
def ipdb_patch(context = 11):
import ipdb
ipdbmain = ipdb.__main__
def _init_pdb(context=context, commands=[]):
try : p = ipdbmain.debugger_cls(context=context)
except TypeError : p = ipdbmain.debugger_cls()
p.rcLines.extend(commands)
return p
def set_trace(frame=None, context=context):
ipdbmain.wrap_sys_excepthook()
if frame is None : frame = ipdbmain.sys._getframe().f_back
p = ipdbmain._init_pdb(context).set_trace(frame)
if p and hasattr(p, 'shell') : p.shell.restore_sys_module_state()
ipdbmain._init_pdb = _init_pdb
ipdb.set_trace = set_trace
return ipdb
ipdb = ipdb_patch()
要添加breakpoint()功能,只需添加:
import sys
sys.breakpointhook = ipdb.set_trace
因此,以下所有命令的上下文大小都正确:
ipdb.set_trace()
breakpoint()
ipdb.post_mortem()
ipdb.pm()
%debug
但是它不适用于此
In [1]: %run -d file.py
如果您知道如何进行调整,请随时发表评论
答案 6 :(得分:0)
如果要停止正在运行的系统中的执行(如其他人所述),请使用:
ipdb.set_trace(context=number_of_lines)
对于运行某些函数或对象的方法,修改此上下文行有点棘手。我发现的唯一方法是:
ipdb.__main__._init_pdb(context=number_of_lines).runcall(callable, *args, **kwargs)
万一它服务于某人。