【问题标题】: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 优雅地处理这种情况。

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2012-07-28
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多