IPython 和控制台中重定向 sys.stderr 不一致
在 IPython 和控制台(Gnome 终端)中将 sys.stderr 重定向到文本文件会产生不同的结果。
f=open('std.log','w')
sys.stderr=f
raise Exception,"message goes here"
在 IPython 中,错误消息直接打印到屏幕上。
In [13]: run std.py
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
/home/xiaohan/code/diving-in-python/htmlparser/std.py in <module>()
2 f=open('std.log','w')
3 sys.stderr=f
----> 4 raise Exception,"message goes here"
5
6
Exception: message goes here
WARNING: Failure executing file: <std.py>
但是,如果我直接在控制台中运行它。
python std.py
错误消息被隐藏并重定向到文本文件。
对这里发生的事情有什么建议吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题是不是写入
stderr
,而是IPython的run
命令拦截异常。当程序引发未处理的异常时,IPython 会将回溯打印到自己的控制台,并附加一个附加警告(警告:执行文件失败)。这是通过将异常挂钩函数安装为 sys.excepthook 来完成的。如果您在测试脚本中显式写入
sys.stderr
,它将按预期写入日志文件。要查看异常挂钩,请将
print(sys.excepthook)
添加到脚本中。直接执行时,它将是
,在 IPython 中,类似于 。 >
。The problem is not writing to
stderr
, but IPython'srun
command intercepting exceptions. When the program raises an unhandled exception, IPython will print the backtrace to its own console, plus an additional warning (WARNING: Failure executing file). This is done by installing an exception hook function assys.excepthook
.If you explicitely write to
sys.stderr
in your test script, it will get written to the log file as expected.To see the exception hook, add
print(sys.excepthook)
to your script. When executed directly, it will be<built-in function excepthook>
, within IPython, something like<bound method InteractiveShell.excepthook of <IPython.iplib.InteractiveShell object at 0x022FA3F0>>
.