【发布时间】:2011-06-05 03:46:11
【问题描述】:
默认情况下,在 IPython 中调试期间,ipdb 在代码中的当前位置上方显示一行,下方显示一行。
有没有一种简单的方法可以使显示的区域更大一些?我认为它是可配置的,但一直找不到。
【问题讨论】:
-
如何将一行上下文视为合理的默认值? :-) 功能请求:github.com/gotcha/ipdb/issues/147
默认情况下,在 IPython 中调试期间,ipdb 在代码中的当前位置上方显示一行,下方显示一行。
有没有一种简单的方法可以使显示的区域更大一些?我认为它是可配置的,但一直找不到。
【问题讨论】:
您可以在 ipdb 中键入l 以显示更多当前上下文的几行
您可以继续点击l,它会继续显示文件中的更多行
如果您想在当前行周围显示更多上下文行,您可以键入l 来获取当前行。然后输入l curr_line - 10, curr_line + 10。假设我在 50 号线,我想看看周围的 20 条线。我会输入:l 40,60 以查看更多信息。
正如@jrieke 在评论中所指出的,您还可以点击ll 以获得更大的上下文信息。关于ll 的一个好处是它会从当前方法的开头一直打印出来(而连续的ls 会显示断点下方的更多行)。
【讨论】:
ll一次获取更多行。
您可以通过以下方式获得更多上下文:
ipdb.set_trace(context=21)
要永久设置上下文大小,请通过以下操作找到安装目录
python -c 'import ipdb; print(ipdb)'
这将显示一个__init__.py 文件。打开该文件并找到该行(也可以在 IPDB 的__main__.py 中找到:
def set_trace(frame=None, context=3):
将3 更改为您想要的任意多的上下文行。
【讨论】:
简单的方法 - 2022
import ipdbprint(ipdb.__file__)__main__.py
except (configparser.NoSectionError, configparser.NoOptionError):
为什么这比正确的方法更好:
【讨论】:
从 IPython 7.21 开始,您可以在 ipdb 中使用 context 命令来更改显示的回溯行数:
import ipdb; ipdb.set_trace()
...
ipdb> context 10
ipdb> bt
你可以在~/.ipdb中加入下面这行,让ipdb自动设置:
context = 10
除此之外,set_trace() 中还有旧的 context= 参数,这使得在运行调试器时可以设置它:
import ipdb; ipdb.set_trace(context=10)
# or, if you've set PYTHONBREAKPOINT=ipdb.set_trace in your environment
breakpoint(context=10)
【讨论】:
编辑:已实现:https://stackoverflow.com/a/66474153/895245
作为对this other answer 的快速补充,这是您通常要添加到要调试的代码中的一个衬里:
__import__('ipdb').set_trace(context=21)
您可能希望从编辑器中为此添加快捷方式,例如对于Vim snipmat 我有:
snippet ipd
__import__('ipdb').set_trace(context=21)
所以我可以只输入ipd<tab>,它会扩展到断点。然后使用dd 轻松删除它,因为所有内容都包含在一行中。
功能请求ipdb增加默认context大小:https://github.com/gotcha/ipdb/issues/147
【讨论】:
如其他人所说,如果您想在正在运行的系统中停止执行,请使用:
ipdb.set_trace(context=number_of_lines)
对于运行某些函数或对象的方法来修改此上下文行有点棘手。我找到的唯一方法是:
ipdb.__main__._init_pdb(context=number_of_lines).runcall(callable, *args, **kwargs)
如果它为某人服务。
【讨论】:
这是为您的程序永久设置上下文的补丁:
(适用于 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()
要添加断点()功能,只需添加:
import sys
sys.breakpointhook = ipdb.set_trace
因此,以下所有命令都具有正确的上下文大小:
ipdb.set_trace()
breakpoint()
ipdb.post_mortem()
ipdb.pm()
%debug
但它不适用于此:
In [1]: %run -d file.py
如果您知道如何调整,请随时加入 cmets
【讨论】: