2012-05-14 9 views
3

を表示しながらStringにPythonの標準エラーをリダイレクトする方法:残念ながらはまだ私は後で介してデータベースに保存することができますし、私は私のスクリプトの標準エラー出力をキャプチャしてい

ostderr = sys.stderr 
sys.stderr = StringIO() 

# do stuff 

mymodel.errors = sys.stderr.getvalue() 
mymodel.save() 
print mymodel.errors 
sys.stderr = ostderr 

、これはカジュアルなデバッグがより困難があれば理由エラーが発生すると、スクリプトが終了するまで表示されません。

上記のようにstderrを文字列でキャプチャするにはどうすればよいですか?それでもリアルタイムでコンソールに表示しますか?

+1

stdoutをstderrに変更してください: http://stackoverflow.com/a/616686/37205 – falcojr

+0

@falcojr、私のアプリでは、stdoutとstderrを分けておく必要があります。 – Cerin

答えて

2

通常のstderrに保存して出力するファイル形式のオブジェクトを使用します。あなたは#do stuffに何が起こるかに応じて、同様closedflush、などのようなものをサポートする必要があるかもしれません

class TeeFiles(object): 
    def __init__(self, file): 
     self.sio = StringIO() 
     self.file = file 

    def write(self, txt): 
     self.sio.write(txt) 
     self.file.write(txt) 

sys.stderr = TeeFiles(sys.stderr) 

# do stuff 

mymodel.errors = sys.stderr.sio.getvalue() 
mymodel.save() 
sys.stderr = sys.stderr.file 

:ような何か。 StringIOから継承した方が簡単かもしれません。