redirect_stderr 不起作用 (Python 3.5)
redirect_stderr does not work (Python 3.5)
#! 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.1
64 位和 3.5.2
64 位上进行了测试,结果相同。
A similar issue in this thread
我也试过按照链接线程中的描述将错误写入文件,但是在 运行 脚本之后文件是空的。
您需要实际写入 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
实例相同。在你 运行 这段代码之后,你应该不会在你的控制台上看到任何回溯,但它会被存储在流对象中:
>>> f.seek(0)
0
>>> print(f.read())
Hello
Exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: foo
#! 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.1
64 位和 3.5.2
64 位上进行了测试,结果相同。
A similar issue in this thread
我也试过按照链接线程中的描述将错误写入文件,但是在 运行 脚本之后文件是空的。
您需要实际写入 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
实例相同。在你 运行 这段代码之后,你应该不会在你的控制台上看到任何回溯,但它会被存储在流对象中:
>>> f.seek(0)
0
>>> print(f.read())
Hello
Exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: foo