6

如果我有一个stdout重定向的程序,我的 pdb 会提示所有转到重定向,因为该库被写入写入stdout.

通常这个问题很微妙,导致我认为程序在真正等待输入时挂起。

人们如何解决这个问题?(不幸的是,不能使用其他调试器,如 winpdb)。

4

3 回答 3

5

这个答案只是对 Ned 的补充,作为一种包装 pdb.pymain()函数的方式,不需要复制 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()

我不知道它是否真的适用于提问者的问题,但它确实符合 Ned 的描述......

于 2009-12-25T02:58:11.920 回答
4

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

use_rawinput = 1

这意味着 Cmd 将raw_input()默认使用方法而不是sys.stdout.readline()从控制台读取。这样做是因为raw_input()支持历史记录(仅在readline加载模块时)和其他有用的位。唯一的问题是raw_input()不支持重定向,所以如果你有一个脚本:

#!/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()它重写上面的脚本应该可以工作。

回到原来的问题,你需要做的就是告诉 Cmd 不要使用raw_input()

Cmd.use_rawinput = 0

或者

pdb = pdb.Pdb()
pdb.use_rawinput=0
pdb.set_trace()
于 2014-11-13T01:44:38.147 回答
2

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

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

pdb = Pdb(stdout=sys.__stdout__)

然后你可以调用 sane_pdb.py 而不是 pdb.py。您必须将 40 行复制到您自己的文件中才能更改其中的一个,这并不令人敬畏,但这是一种选择。

于 2009-12-24T21:17:28.690 回答