2009-12-24 67 views
5

如果我有一個程序,其中stdout被重定向,我的pdb提示全部進入重定向,因爲該庫被寫入以寫入stdout處理python pdb flakiness re/stdout的最佳方法是什麼?

通常情況下這個問題是很微妙的,害我想,當它真的等待輸入一個程序掛。

人們如何解決這個問題? (不幸的是,使用其他調試器如winpdb不是一個選項)。

回答

2

這裏的問題是,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() 
2

如果您在代碼中調用pdb,您可以將自己的stdout傳遞給構造函數。 sys.__stdout__可能是一個不錯的選擇。

如果從從命令行調用PDB,你可以從pdb.py的main()功能複製到自己的sane_pdb.py。然後將Pdb()初始化更改爲:

pdb = Pdb(stdout=sys.__stdout__) 

然後,您可以調用sane_pdb.py而不是pdb.py.你不得不復制40行到你自己的文件中去改變其中的一個,但這是一個選項。

4

這個答案只是補充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() 

我不「知道,如果它的實際工作爲提問者的問題,但它確實斯內德描述了...

相關問題