您只需临时重定向即可轻松捕获标准输出sys.stdout
to a StringIO
对象,如下:
import StringIO
import sys
def foo(inStr):
print "hi"+inStr
def test_foo():
capturedOutput = StringIO.StringIO() # Make StringIO.
sys.stdout = capturedOutput # Redirect stdout.
foo('test') # Call function.
sys.stdout = sys.__stdout__ # Reset redirect.
print 'Captured', capturedOutput.getvalue() # Now works.
test_foo()
该程序的输出是:
Captured hitest
这表明重定向成功捕获了输出,并且您能够将输出流恢复到开始捕获之前的状态。
请注意,上面的代码适用于 Python 2.7,如问题所示。 Python 3 略有不同:
import io
import sys
def foo(inStr):
print ("hi"+inStr)
def test_foo():
capturedOutput = io.StringIO() # Create StringIO.
sys.stdout = capturedOutput # Redirect stdout.
foo('test') # Call function.
sys.stdout = sys.__stdout__ # Reset redirect.
print ('Captured', capturedOutput.getvalue()) # Now works.
test_foo()
如果您的函数可能引发异常,您还需要小心,因为这可能意味着重定向重置可能无法完成。这可能会影响以后的测试。
解决这个问题的一种方法是将函数调用包装在try/except
阻止,并在发生异常时重置重定向并重新引发异常。然后,对函数的单行调用将变成这样,其他代码保持原样:
try:
foo('test') # Call function.
except:
sys.stdout = sys.__stdout__ # Reset redirect.
raise