如何在不停止 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:1
或 set_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 版本中添加,并允许自定义断点行为。
我怀疑我的一个循环有问题,所以我用 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:1
或 set_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 版本中添加,并允许自定义断点行为。