如果我有一個程序,其中stdout
被重定向,我的pdb提示全部進入重定向,因爲該庫被寫入以寫入stdout
。處理python pdb flakiness re/stdout的最佳方法是什麼?
通常情況下這個問題是很微妙的,害我想,當它真的等待輸入一個程序掛。
人們如何解決這個問題? (不幸的是,使用其他調試器如winpdb不是一個選項)。
如果我有一個程序,其中stdout
被重定向,我的pdb提示全部進入重定向,因爲該庫被寫入以寫入stdout
。處理python pdb flakiness re/stdout的最佳方法是什麼?
通常情況下這個問題是很微妙的,害我想,當它真的等待輸入一個程序掛。
人們如何解決這個問題? (不幸的是,使用其他調試器如winpdb不是一個選項)。
這裏的問題是,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,你可以從pdb.py的main()
功能複製到自己的sane_pdb.py。然後將Pdb()初始化更改爲:
pdb = Pdb(stdout=sys.__stdout__)
然後,您可以調用sane_pdb.py而不是pdb.py.你不得不復制40行到你自己的文件中去改變其中的一個,但這是一個選項。
這個答案只是補充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()
我不「知道,如果它的實際工作爲提問者的問題,但它確實斯內德描述了...