Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pdb时如何忽略一行?_Python_Pdb - Fatal编程技术网

Python 使用pdb时如何忽略一行?

Python 使用pdb时如何忽略一行?,python,pdb,Python,Pdb,对于一些快速的Python调试,我偶尔会加入一个importpdb;pdb.set_trace()行将我放入调试器。非常方便。然而,如果我想调试一个循环,它可能会运行很多次,很多次,但它会在某种程度上失去它的有效性。我可以在c上混搭多次,多次,多次继续,但有没有办法删除/忽略硬编码断点,让它完成 我可以设置一个全局标志并有条件地运行它,但这样我就失去了一行断点的“独立性”,也需要为每个pdb设置另一个标志。set_trace()您是否查看了条件bpnumber?您可以禁用断点,然后将其设置为条件

对于一些快速的Python调试,我偶尔会加入一个
importpdb;pdb.set_trace()
行将我放入调试器。非常方便。然而,如果我想调试一个循环,它可能会运行很多次,很多次,但它会在某种程度上失去它的有效性。我可以在
c
上混搭多次,多次,多次继续,但有没有办法删除/忽略硬编码断点,让它完成


我可以设置一个全局标志并有条件地运行它,但这样我就失去了一行断点的“独立性”,也需要为每个
pdb设置另一个标志。set_trace()

您是否查看了
条件bpnumber
?您可以禁用断点,然后将其设置为条件断点。或者,您可以使用
break
tbreak
首先使断点有条件。可以找到详细信息。

以下黑客程序将在当前运行中(即,从代码中的任何位置)禁用所有其他调用

创建此
noop\u pdb
下拉列表:

# noop_pdb.py
def set_trace(*args, **kwargs):
    pass
然后,一旦您的代码在real
pdb.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提供的“直到”命令

    发件人:

    unt(il)

    继续执行,直到行号大于的行 在到达当前帧或从当前帧返回时


    在pdb中使用“return”可以在循环中传递pdb.set_trace(),并跳转到当前函数的最后一行。

    pdb.set_trace=lambda:None只是将我从重新启动脚本时非常痛苦的情况中解救出来
    pdb.set_trace.disable_current()