如果我有一个stdout重定向的程序,我的pdb会提示所有进入重定向,因为写入库是为了写入stdout.
通常这个问题很微妙,导致我认为程序正在等待输入时挂起.
人们如何解决这个问题?(不幸的是,使用其他调试器如winpdb不是一个选项).
这个答案只是对Ned的补充,它是一种包装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()
Run Code Online (Sandbox Code Playgroud)
我不知道它是否真的适用于发问者的问题,但它能满足内德所说的...
这里的问题是 PDB 使用 Cmd 类,默认情况下:
use_rawinput = 1
Run Code Online (Sandbox Code Playgroud)
这意味着Cmd将raw_input()默认使用方法而不是sys.stdout.readline()从控制台读取。这样做是因为raw_input()支持历史记录(仅当readline加载模块时)和其他有用的位。唯一的问题是raw_input()不支持重定向,因此如果您有脚本:
#!/usr/bin/python
name=raw_input("Enter your name: ")
Run Code Online (Sandbox Code Playgroud)
并运行它
> python test.py
Enter your name: Alex
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用输出重定向来运行它,它将卡住
> python test.py | tee log
Run Code Online (Sandbox Code Playgroud)
这正是 PDB 使用的方法,也是它被卡住的原因。如我所说sys.stdin.readline()支持重定向,如果您使用它重写上面的脚本readline()应该可以工作。
回到最初的问题,您所需要做的就是告诉 Cmd 不要使用raw_input():
Cmd.use_rawinput = 0
Run Code Online (Sandbox Code Playgroud)
或者
pdb = pdb.Pdb()
pdb.use_rawinput=0
pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1505 次 |
| 最近记录: |