IPython 和控制台中重定向 sys.stderr 不一致

发布于 2024-11-30 09:34:43 字数 777 浏览 2 评论 0 原文

在 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 

错误消息被隐藏并重定向到文本文件。

对这里发生的事情有什么建议吗?

Redirecting sys.stderr to a text file in IPython and console(Gnome terminal) yields different results.

f=open('std.log','w')
sys.stderr=f
raise Exception,"message goes here"

In IPython, the error message is printed directed into the screen.

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>

However, if I ran it in console directly.

python std.py 

The error message is hidden and redirected to the text file.

Any suggestions on what is going on here??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

好倦 2024-12-07 09:34:43

问题是不是写入stderr,而是IPython的run命令拦截异常。当程序引发未处理的异常时,IPython 会将回溯打印到自己的控制台,并附加一个附加警告(警告:执行文件失败)。这是通过将异常挂钩函数安装为 sys.excepthook 来完成的。

如果您在测试脚本中显式写入sys.stderr,它将按预期写入日志文件。

要查看异常挂钩,请将 print(sys.excepthook) 添加到脚本中。直接执行时,它将是 ,在 IPython 中,类似于 。 >

The problem is not writing to stderr, but IPython's run 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 as sys.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>>.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文