如果我有一个stdout
重定向的程序,我的 pdb 会提示所有转到重定向,因为该库被写入写入stdout
.
通常这个问题很微妙,导致我认为程序在真正等待输入时挂起。
人们如何解决这个问题?(不幸的是,不能使用其他调试器,如 winpdb)。
这个答案只是对 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 的描述......
这里的问题是 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()
如果您在代码中调用 pdb,则可以将自己的 stdout 传递给构造函数。 sys.__stdout__
可能是一个不错的选择。
如果您从命令行调用 pdb,您可以将main()
函数从 pdb.py 复制到您自己的 sane_pdb.py 中。然后将 Pdb() 初始化更改为:
pdb = Pdb(stdout=sys.__stdout__)
然后你可以调用 sane_pdb.py 而不是 pdb.py。您必须将 40 行复制到您自己的文件中才能更改其中的一个,这并不令人敬畏,但这是一种选择。