2011-12-15 13 views
11

インポート時にstdoutまたはstderrに出力されているサードパーティ製のpythonモジュールに問題があり、これがunittestの出力を破っています。Pythonでunittestを実行しているときにstdoutまたはstderrを一時的に隠す方法

出力を非表示にするには、stdoutを一時的にリダイレクトする方法を教えてください。 Pythonの2.5構文:)

更新

リミット、私はsys.stdoutsys.__stderr__方法は、この場合には動作しないことを言及を忘れてしまいました。私の知る限り、この欠陥モジュールはネイティブコードを使用しています。

答えて

16

あなたはこのようにそれに何かを行うことができます:あなたはまた、モジュールをインポートするときに、あなたのためsys.stdoutsys.stderrにパッチを適用できるようにmockを使用することができます

>>> import sys, os 
>>> _stderr = sys.stderr 
>>> _stdout = sys.stdout 
>>> null = open(os.devnull,'wb') 
>>> sys.stdout = sys.stderr = null 
>>> print "Bleh" 
>>> sys.stderr = _stderr 
>>> sys.stdout = _stdout 
>>> print "Bleh" 
Bleh 
+6

'os.devnull'、何かを学んだ! +1 – juliomalegria

+0

あなたの例はうまくいくはずです、私は 'sys .__ stdout__'と' sys .__ stderr__'を変更しようとしましたが、まだ出力を得ています: '[[ – sorin

20

。この戦略を使用するであろう試験モジュールの例:

bad_moduleがインポートされているとき sys.stdoutsys.stderrに印刷されたサードパーティのモジュールである
import os 
devnull = open(os.devnull, 'w') 

from mock import patch 
with patch('sys.stdout', devnull): 
    with patch('sys.stderr', devnull): 
     import bad_module 

# Test cases writen here 

+0

]' mock'の部分は 'stdout' OPが示すように輸入中に書かれていますか? – MattH

+0

@MattHあなたが正しいです、その例は間違っています。私は、sys.stdoutとsys.stderrにパッチを当てる答えは、モジュールがインポートされたときにのみうっかりした。ご意見をいただきありがとうございます。 – jcollado

+0

+1興味深いことに、私は「模擬」に慣れていない。あなたは 'import unittest'をもう必要としないでしょう。 – MattH

関連する問題