我有一个错误的第三方python模块,它在导入时输出到stdout或stderr,这是打破了我的unittests的输出。如何在Python中运行unittest时临时隐藏stdout或stderr
如何临时重定向stdout
以隐藏其输出。
限于Python 2.5的语法:)
更新,我忘了提,sys.stdout
和sys.__stderr__
方法并不在这种情况下工作。据我所知,这个错误的模块正在使用本机代码。
我有一个错误的第三方python模块,它在导入时输出到stdout或stderr,这是打破了我的unittests的输出。如何在Python中运行unittest时临时隐藏stdout或stderr
如何临时重定向stdout
以隐藏其输出。
限于Python 2.5的语法:)
更新,我忘了提,sys.stdout
和sys.__stderr__
方法并不在这种情况下工作。据我所知,这个错误的模块正在使用本机代码。
你可以做这样的事情:
>>> 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
您还可以使用mock
让你修补sys.stdout
和sys.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
其中bad_module
是打印到sys.stdout
和sys.stderr
被导入时的第三方模块。
`os.devnull`,学到了一些东西! +1 – juliomalegria 2011-12-15 16:35:51
你的例子应该工作,我甚至试图改变`sys .__ stdout__`和`sys .__ stderr__`,但仍然得到输出`:[`` – sorin 2011-12-15 17:28:53