如何在不停止 python 程序的情况下禁用 pdb.set_trace() 并编辑代码

how to disable pdb.set_trace() without stopping python program and edit the code

我怀疑我的一个循环有问题,所以我用 pdb.set_trace()

设置了一个断点
import pdb
for i in range(100):
    print("a")
    pdb.set_trace()
    print("b")

在这个循环中检查了几次变量之后,我决定继续这个编程,不再中断。所以我尝试使用 b 命令获取中断号,但没有列出中断号。我猜这行代码没有设置断点。但是如何在不停止程序和更改代码的情况下运行这个 "break points"?

据我所知,你无法绕过 set_trace,但你可以中和它,一旦调试器停止,键入:

pdb.set_trace = lambda: 1

那就继续吧,不会再坏了。

不幸的是 pdb 缺少一些功能(甚至是显示列表等基本功能),您在这里找到了另一个例子。好消息是 pdb++pdb 的一个很好的 drop-in 替代品,它解决的问题之一就是禁用 set_trace 的问题。所以你可以简单地做:

pip install pdbpp

然后在 (Pdb++) 提示符下键入

pdb.disable()

简单!除此之外,您还会得到许多其他有用的东西。

可以在没有 PDB 控制的情况下启动 Python 脚本,但随后会遇到遗留问题 set_trace()。为了防止每次遇到 set_trace() 时都进入调试器,可以应用与上述类似的技巧(将符号的引用更改为指向无害函数)。

但是,必须修改被调试者的命名空间,而不是调试器本身的命名空间。简单地覆盖 pdb.set_trace = lambda:1set_trace = lambda:1 对我不起作用。

以下技巧在 pdb 提示符下奏效:

pdb> globals()['set_trace'] = lambda:1

这一行首先调用globals()获取正在调试的程序的一个dict,然后修改那里set_trace的引用

设置断点(需要Python 3.7):

breakpoint()

禁用使用 breakpoint() 函数设置的断点:

import os
os.environ["PYTHONBREAKPOINT"] = "0"

长话短说:

在Python的3.7版本中,breakpoint() built-in function for setting breakpoints was introduced. By default, it will call pdb.set_trace(). Also, since the 3.7 version of Python the PYTHONBREAKPOINT环境变量可用。使用breakpoint()函数时考虑
因此,为了禁用这些断点(使用 breakpoint() 函数设置),可以像这样设置 PYTHONBREAKPOINT 环境变量:

import os
os.environ["PYTHONBREAKPOINT"] = "0"

在这里提及 sys.breakpointhook() 可能会有用,它也在 Python 的 3.7 版本中添加,并允许自定义断点行为。