【发布时间】:2014-11-17 07:22:15
【问题描述】:
我编写了一些单元测试来分析使用标准 python 日志记录功能记录的数据。使用我在这里找到的一些想法:Capture stdout from a script in Python 关于如何从 stderr 捕获数据,我提出了以下脚本,我已将其简化到最低限度以说明我遇到的问题。 (下面的循环模拟了这个函数可能被各种单元测试调用的事实)
import logging, sys
from StringIO import StringIO
def get_stderr():
saved_stderr = sys.stderr
stderr_string_io = StringIO()
sys.stderr = stderr_string_io
try:
logging.error("Foobar!!!")
finally:
# set the stdout and stderr back to their original values
sys.stderr = saved_stderr
err_output = stderr_string_io.getvalue()
return err_output
for x in [1, 2]:
err_output = get_stderr()
print "Run %d: %s" % (x, err_output)
如果您运行脚本,它将给出以下输出,其中第二次循环迭代的日志输出完全丢失:
Run 1: ERROR:root:Foobar!!!
Run 2:
Process finished with exit code 0
虽然我希望它给出以下输出:
Run 1: ERROR:root:Foobar!!!
Run 2: ERROR:root:Foobar!!!
Process finished with exit code 0
注意:在函数末尾执行stderr_string_io.close() 不起作用,因为脚本会在下次执行函数时抛出ValueError。
为什么这段代码的行为不像预期的那样,纠正这个问题的解决方案是什么?
【问题讨论】:
-
这确实是奇怪的行为。如果您将
logging.error("practicing")放在文件顶部,则一切正常...但忽略您替换stderr。 -
是的,这很奇怪!
标签: python unit-testing stderr stringio