代码之家  ›  专栏  ›  技术社区  ›  YGA

处理python pdb片状re/stdout的最佳方法?

  •  5
  • YGA  · 技术社区  · 16 年前

    如果我有一个程序 stdout 是重定向的,我的PDB提示所有人转到重定向,因为库是写入到的 标准输出 .

    通常这个问题是微妙的,使我认为一个程序在真正等待输入时挂起。

    人们如何解决这个问题?(不幸的是,使用WinPDB等其他调试器不是一个选项)。

    3 回复  |  直到 11 年前
        1
  •  3
  •   Alexander Starostin    11 年前

    这里的问题是pdb使用的是cmd类,默认情况下:

    use_rawinput = 1
    

    这意味着命令将使用 raw_input() 默认方法而不是 sys.stdout.readline() 从控制台读取。这样做是因为 原始输入() 支持历史记录(仅当 readline 模块被加载)和其他有用的位。唯一的问题是 RWYIN() 不支持重定向,因此如果您有脚本:

    #!/usr/bin/python
    name=raw_input("Enter your name: ")
    

    然后运行它

    > python test.py
    Enter your name: Alex
    

    但是,如果使用输出重定向运行它,它将卡住

    > python test.py | tee log
    

    这正是PDB所使用的,也是它被卡住的原因。正如我提到的 sys.stdin.readline() 支持重定向,如果使用 readline() 它应该起作用。

    回到原来的版本,你只需要告诉命令不要使用 RWYIN() 以下内容:

    Cmd.use_rawinput = 0
    

    或

    pdb = pdb.Pdb()
    pdb.use_rawinput=0
    pdb.set_trace()
    
        2
  •  4
  •   Peter Hansen    16 年前

    这个答案只是对内德的补充,作为包装pdb.py的一种方式。 main() 不需要复制40行就可以更改其中一行:

    # sane_pdb.py: launch Pdb with stdout on original
    import sys, pdb
    def fixed_pdb(Pdb=pdb.Pdb):
        '''make Pdb() tied to original stdout'''
        return Pdb(stdout=sys.__stdout__)
    
    if __name__ == '__main__':
        pdb.Pdb = fixed_pdb
        pdb.main()
    

    我不知道它是否真的适用于提问者的问题,但它做了内德描述的…

        3
  •  2
  •   Ned Batchelder    16 年前

    如果在代码中调用PDB,则可以将自己的stdout传递到构造函数中。 sys.__stdout__ 可能是个不错的选择。

    如果从命令行调用pdb,则可以复制 main() 从pdb.py到您自己的sane_pdb.py。然后将pdb()初始化更改为:

    pdb = Pdb(stdout=sys.__stdout__)
    

    然后可以调用sane_pdb.py而不是pdb.py。你只需要复制40行到你自己的文件中就可以更改其中一行,这并不可怕,但这是一个选项。