【发布时间】:2017-09-13 14:56:30
【问题描述】:
我在装有 Python 3.6 的 Windows 7 机器上
我想知道为什么以下代码将记录器消息打印到控制台,即使记录器(或者更确切地说其父处理程序)配置为发送到标准输出并且标准输出被重定向到io.StringIO()。
import sys
import logging
from io import StringIO
logging.basicConfig(format='%(message)s', level=logging.DEBUG, stream=sys.stdout)
logger = logging.getLogger(__name__)
old_stdout = sys.stdout
sys.stdout = tmp = StringIO()
print('*** FIRST IN CODE : print')
logger.debug('*** SECOND IN CODE : logger')
sys.stdout = old_stdout
print(tmp.getvalue())
如果您注释掉这段代码中的最后一行 (print(tmp.getvalue())),您会看到 *** FIRST IN CODE : print 不再出现在控制台上,而 *** SECOND IN CODE : logger 仍然出现。
我尝试从basicConfig() 调用中删除stream=sys.stdout(在这种情况下,创建的StreamHandler 将默认为stderr)并重定向stderr,但结果与stderr 完全相同。
我还查看了StreamHandler 的代码,但也没有任何解释。
我了解到 Windows 上的 stdout/-err 重定向有一些怪癖。这是这里发生的事情还是我错过了什么?
【问题讨论】:
标签: python python-3.x logging stdout io-redirection