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

标签 python console ipython stderr redirect

将 sys.stderr 重定向到 IPython 和控制台(Gnome 终端)中的文本文件会产生不同的结果。

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 

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

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

最佳答案

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

如果您明确写信给sys.stderr在您的测试脚本中,它将按预期写入日志文件。

要查看异常 Hook ,请添加 print(sys.excepthook)到你的脚本。直接执行的话会是<built-in function excepthook> ,在 IPython 中,类似 <bound method InteractiveShell.excepthook of <IPython.iplib.InteractiveShell object at 0x022FA3F0>> .

关于python - IPython 和控制台中重定向 sys.stderr 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7118660/

相关文章:

python - 从 pycharm 控制台运行模块

regex - 我想根据 Powershell 中的正则表达式为管道字符串的高亮部分着色

python - txt 文件使用 .write() python 显示为空白

numpy - 使用 Python/iPython 的网络绘图错误

python - 如何在Hadoop中读取相应文件中的文件名和字数?

python - 是否可以使用 Django ORM 选择不接收仅接收基于实际列计算的值的表字段?

android - 在服务器上构建(不开发)您的Android应用.apk(渐变构建)?

python - 用于多条 SQL 行的 f 字符串

.net - 我可以修改 mstest 控制台输出吗?

python - 在只读 View (如 HTML 文件)中打开 IPython 笔记本 (*.ipynb)