python中重写stderr的效果

python中重写stderr的效果,python,python-2.7,python-internals,Python,Python 2.7,Python Internals,以下代码导致python崩溃: import sys sys.stdout = sys.stderr = None print "goodbye world!" 我知道没有真正的理由编写这样的代码,但我想知道为什么它会崩溃。 我的第一个猜测是,print命令失败,因为stdout被覆盖,然后,在尝试引发异常时,另一个异常被引发,因为stderr也被覆盖 因此,它在尝试引发异常时会出现堆栈溢出 有人能解释一下背景中到底发生了什么吗? 这是堆栈溢出吗?由于sys.stdout设置为None,因此p

以下代码导致python崩溃:

import sys
sys.stdout = sys.stderr = None
print "goodbye world!"
我知道没有真正的理由编写这样的代码,但我想知道为什么它会崩溃。
我的第一个猜测是,
print
命令失败,因为
stdout
被覆盖,然后,在尝试引发异常时,另一个异常被引发,因为
stderr
也被覆盖

因此,它在尝试引发异常时会出现堆栈溢出

有人能解释一下背景中到底发生了什么吗?

这是堆栈溢出吗?

由于
sys.stdout
设置为
None
,因此
print
语句引发异常:

>>> 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向原始的
stderr
(由操作系统而不是
sys.stderr
)写入一条消息,让您知道它无法告诉您到底出了什么问题

这是而不是崩溃,这是Python优雅地处理情况

PyObject *f = PySys_GetObject("stderr");
Py_INCREF(value);
if (f == NULL || f == Py_None)
    fprintf(stderr, "lost sys.stderr\n");