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

YGA*_*YGA 5 python pdb

如果我有一个stdout重定向的程序,我的pdb会提示所有进入重定向,因为写入库是为了写入stdout.

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

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

Pet*_*sen 5

这个答案只是对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)

我不知道它是否真的适用于发问者的问题,但它能满足内德所说的...


Ale*_*tin 4

这里的问题是 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)