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

12

我怀疑我的一个循环存在问题,因此我使用pdb.set_trace()设置了断点

import pdb
for i in range(100):
    print("a")
    pdb.set_trace()
    print("b")
经过几次检查变量后,我决定继续编程而不再添加断点。因此,我尝试使用 b 命令获取断点编号,但没有列出任何断点。我猜测这行代码没有设置断点。但是我该如何在不停止程序并更改代码的情况下去掉这些 "断点" 呢?

为什么 r(eturn) 对你不起作用? - abcd
r 命令不起作用,如果从函数调用中返回,则 r 命令的功能失效。 如果再次调用此函数,则程序仍会停止。 - scott huang
我认为这可能是https://dev59.com/pmMm5IYBdhLWcg3wKsgj#17820890的重复,尽管该问题不明确,因为它没有说明是否使用断点或`set_trace`。 - Adam Spiers
5个回答

39

据我所知,你无法绕过set_trace,但是一旦调试器停止,你可以将其中和,输入以下内容:

pdb.set_trace = lambda: 1

然后继续进行,它不会再次中断。


1
这样做是可行的,但会禁用所有后续的pdb.set_trace()。我也可以这样做:“如果我的标志:pdb.set_trace()”,但这看起来有点丑陋。 - scott huang
@scotthuang 调试条件变量对我来说没问题,而且你可以创建pdb别名以快速禁用/启用set_trace - georgexsh
跳转不起作用。每次 Python 解释器遇到 set_trace,它都会停止。我认为我对 pdb 要求太高了。我将在程序的第一行添加 set_trace。然后通过命令设置断点。如果我不需要它,我会清除断点。 - scott huang
@scotthuang,你可以跳出for循环,但这会改变代码逻辑。 - georgexsh
是的。我可以使用你提供的方法,它适用于某些情况。我曾经在其他语言的调试器中使用过这种方法。但是现在,我认为我会尝试绕过这个问题。 - scott huang
太棒了,我已经寻找这样的东西有一段时间了。 - Lars Larsson

10

设置断点(需要 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

7

很不幸,pdb缺少许多功能(甚至基本的显示列表),你在这里找到了另一个例子。好消息是pdb++pdb的出色替代品之一,它解决的问题正是禁用set_trace。所以你只需要做:

pip install pdbpp

然后在(Pdb++)提示符下,键入以下内容:

pdb.disable()

太容易了! 除此之外,您还将获得许多其他有用的好处。


1
什么样的好东西? - alper

1
可以在没有PDB控制的情况下启动Python脚本,但是遇到一个偶然留下的set_trace()。为了防止每次遇到set_trace()时都进入调试器,可以应用与上述类似的技巧(将符号的引用更改为指向无害函数)。但是,必须修改调试程序的命名空间,而不是调试器本身的命名空间。简单地覆盖pdb.set_trace = lambda:1或set_trace = lambda:1对我没有起作用。以下技巧从pdb提示中起作用:
pdb> globals()['set_trace'] = lambda:1

这一行首先调用 globals() 函数来获取正在调试的程序的字典,然后修改了其中 set_trace 的引用。


1

解决这个问题的一种方法是不在脚本本身中编写断点,而是在启动Python时使用python -m pdb my_script.py设置断点。

然后,在脚本开始执行之前,您会首先进入提示符,您可以例如编写

(Pdb) b 321

在第321行设置断点(您还可以指定文件并指定条件b 321,i == 50

然后

(Pdb) c

(for continue) 开始执行实际脚本。您可以使用此方式设置的断点,在完成后清除:

(Pdb) cl

(为了清晰)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接