【问题标题】:effects of overriding stderr in python在 python 中覆盖 stderr 的效果
【发布时间】:2014-02-18 11:29:44
【问题描述】:
以下代码导致python崩溃:
import sys
sys.stdout = sys.stderr = None
print "goodbye world!"
我知道编写这样的代码没有真正的理由,但我想知道它为什么会崩溃。
我的第一个猜测是print 命令失败,因为stdout 被覆盖,然后,在尝试引发异常时,又引发了另一个异常,因为stderr 也被覆盖了。
所以它在尝试引发异常时会发生堆栈溢出。
谁能解释一下这里的后台到底发生了什么?
这是堆栈溢出吗?
【问题讨论】:
标签:
python
python-2.7
python-internals
【解决方案1】:
print 语句抛出异常,因为sys.stdout 设置为None:
>>> import sys
>>> sys.stdout = None
>>> print "goodbye world!"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'write'
仅此异常就足以让 Python 退出,因为您没有在任何地方处理异常。
但是,您将sys.stderr 设置为None 以及,因此没有地方可以写入此回溯。这种情况在PyErr_Display function中是特例:
PyObject *f = PySys_GetObject("stderr");
Py_INCREF(value);
if (f == NULL || f == Py_None)
fprintf(stderr, "lost sys.stderr\n");
在这里,Python 向原始的stderr(由操作系统传递给 Python,而不是 sys.stderr)写了一条消息,让你知道它无法告诉你真正出了什么问题。
这不是崩溃,这是 Python 优雅地处理这种情况。