Python 使用pdb时如何忽略一行?
对于一些快速的Python调试,我偶尔会加入一个Python 使用pdb时如何忽略一行?,python,pdb,Python,Pdb,对于一些快速的Python调试,我偶尔会加入一个importpdb;pdb.set_trace()行将我放入调试器。非常方便。然而,如果我想调试一个循环,它可能会运行很多次,很多次,但它会在某种程度上失去它的有效性。我可以在c上混搭多次,多次,多次继续,但有没有办法删除/忽略硬编码断点,让它完成 我可以设置一个全局标志并有条件地运行它,但这样我就失去了一行断点的“独立性”,也需要为每个pdb设置另一个标志。set_trace()您是否查看了条件bpnumber?您可以禁用断点,然后将其设置为条件
importpdb;pdb.set_trace()
行将我放入调试器。非常方便。然而,如果我想调试一个循环,它可能会运行很多次,很多次,但它会在某种程度上失去它的有效性。我可以在c
上混搭多次,多次,多次继续,但有没有办法删除/忽略硬编码断点,让它完成
我可以设置一个全局标志并有条件地运行它,但这样我就失去了一行断点的“独立性”,也需要为每个
pdb设置另一个标志。set_trace()
您是否查看了条件bpnumber
?您可以禁用断点,然后将其设置为条件断点。或者,您可以使用break
或tbreak
首先使断点有条件。可以找到详细信息。以下黑客程序将在当前运行中(即,从代码中的任何位置)禁用所有其他调用
创建此noop\u pdb
下拉列表:
# noop_pdb.py
def set_trace(*args, **kwargs):
pass
然后,一旦您的代码在realpdb.set_trace
中中断,并且要禁用对set_trace
的其余调用,请执行以下操作:
sys.modules['pdb'] = __import__('noop_pdb')
下一次口译员遇到这样的行时:
import pdb;pdb.set_trace()
它避免了重新导入内置的pdb
,从而拾取插入项
编辑:另一种不需要noop\u pdb的实现方法是用noop替换
set\u trace
,而不是整个pdb
模块:pdb.set\u trace=lambda:None
我的另一个答案是一种快速破解,并不完美(将禁用对set\u trace
的所有调用)。这里有一个更好的解决方案
我们定义了一个模块包装pdb
。在该模块中,set\u trace
是一个可调用对象,维护一个禁用调用者列表(由文件名/行号标识)
在代码中,确保使用包装器:
import mypdb as pdb; pdb.set_trace()
当您想禁用当前设置\u跟踪
-呼叫线路时,请执行以下操作:
pdb.set_trace.disable_current()
注:
ipdb
而不是pdb
pdb
时,由于实际调用pdb.set_trace
的函数在包装器中,因此中断时的当前帧将在其中。使用up
命令可获得所需的帧。如果使用ipdb
,则不会发生这种情况(包装器中的实现确保在正确的位置中断)ipdb
时,我发现它会不一致地报告调用方帧行号。这意味着第一次执行pdb.set\u trace.disable\u current()
,它可能不起作用。如果下一次中断,请再执行一次--第二次保持不变pdb
包装器对其他事情也很有用。我有自己的set\u trace
包装器,它可以避免在not sys.stdout.isatty
时中断(如果进程未连接到终端,或者将stdout重定向到文件/管道时,您永远不希望中断)也就是说,拥有自己的pdb
包装器并调用其set\u trace
而不是pdb
,是一种很好的做法在pdb中使用“return”可以在循环中传递pdb.set_trace(),并跳转到当前函数的最后一行。pdb.set_trace=lambda:None只是将我从重新启动脚本时非常痛苦的情况中解救出来
pdb.set_trace.disable_current()