重定向_stderr不起作用(Python 3.5)

2024-09-26 22:45:26 发布

您现在位置:Python中文网/ 问答频道 /正文

#! python3
from contextlib import redirect_stderr
import io

f = io.StringIO()
with redirect_stderr(f):
    # simulates an error
    erd

如上所述,我使用了redirect_stderr函数将stderr重定向到StringIO对象。但是,它不起作用,因为错误消息仍然会在命令提示符中打印出来:

Traceback (most recent call last):
  File "C:\Users\max\testerr.py", line 8, in <module>
    erd
NameError: name 'erd' is not defined

我在Python 3.5.164位和3.5.264位上测试了它,结果相同

A similar issue in this thread

我还尝试将错误写入链接线程中所述的文件,但运行脚本后该文件为空


Tags: 文件infromioimportan错误with
1条回答
网友
1楼 · 发布于 2024-09-26 22:45:26

您需要实际写入stderr,它不是捕获异常的工具

>>> from contextlib import redirect_stderr
>>> import io
>>> f = io.StringIO()
>>> import sys
>>> with redirect_stderr(f):
...    print('Hello', file=sys.stderr)
...
>>> f.seek(0)
0
>>> f.read()
'Hello\n'

要捕获异常,您需要做更多的工作。您可以使用日志库(外部),或者编写自己的异常处理程序,然后使用自定义输出

下面是一些快速功能,它使用记录器实例帮助写入流:

log = logging.getLogger('TEST')
log.addHandler(logging.StreamHandler(stream=f))

def exception_handler(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
       # Let the system handle things like CTRL+C
       sys.__excepthook__(*args)
    log.error('Exception: ', exc_info=(exc_type, exc_value, exc_traceback))

sys.excepthook = exception_handler
raise RuntimeError('foo')

这里f是上面相同的StringIO实例。运行此代码后,您不应在控制台上看到任何回溯,但它将存储在stream对象中:

>>> f.seek(0)
0
>>> print(f.read())
Hello
Exception:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: foo

相关问题 更多 >

    热门问题