我怀疑我的一个循环存在问题,因此我使用pdb.set_trace()设置了断点
import pdb
for i in range(100):
print("a")
pdb.set_trace()
print("b")
经过几次检查变量后,我决定继续编程而不再添加断点。因此,我尝试使用 b
命令获取断点编号,但没有列出任何断点。我猜测这行代码没有设置断点。但是我该如何在不停止程序并更改代码的情况下去掉这些 "断点" 呢?据我所知,你无法绕过set_trace
,但是一旦调试器停止,你可以将其中和,输入以下内容:
pdb.set_trace = lambda: 1
然后继续进行,它不会再次中断。
set_trace
。 - georgexsh设置断点(需要 Python 3.7):
breakpoint()
禁用使用breakpoint()
函数设置的断点:
import os
os.environ["PYTHONBREAKPOINT"] = "0"
长话短说:
在Python 3.7版本中,引入了用于设置断点的内置函数breakpoint()。默认情况下,它会调用pdb.set_trace()函数。此外,自Python 3.7版本以来,环境变量PYTHONBREAKPOINT也可用。当使用breakpoint()函数时,它将被考虑在内。
因此,要禁用这些由breakpoint()函数设置的断点,可以像这样设置PYTHONBREAKPOINT环境变量:
import os
os.environ["PYTHONBREAKPOINT"] = "0"
这里可能需要提到 sys.breakpointhook(),它也被添加到 Python 3.7 版本中,允许自定义断点的行为。
PYTHONBREAKPOINT=0 python main.py
。 - Stefan_EOX很不幸,pdb
缺少许多功能(甚至基本的显示列表),你在这里找到了另一个例子。好消息是pdb++
是pdb
的出色替代品之一,它解决的问题正是禁用set_trace
。所以你只需要做:
pip install pdbpp
然后在(Pdb++)
提示符下,键入以下内容:
pdb.disable()
太容易了! 除此之外,您还将获得许多其他有用的好处。
pdb> globals()['set_trace'] = lambda:1
这一行首先调用 globals()
函数来获取正在调试的程序的字典,然后修改了其中 set_trace
的引用。
解决这个问题的一种方法是不在脚本本身中编写断点,而是在启动Python时使用python -m pdb my_script.py
设置断点。
然后,在脚本开始执行之前,您会首先进入提示符,您可以例如编写
(Pdb) b 321
在第321行设置断点(您还可以指定文件并指定条件b 321,i == 50
)
然后
(Pdb) c
(for continue) 开始执行实际脚本。您可以使用此方式设置的断点,在完成后清除:
(Pdb) cl
(为了清晰)
r(eturn)
对你不起作用? - abcd