2

次のコードにより、Python がクラッシュしました。

import sys
sys.stdout = sys.stderr = None
print "goodbye world!"

そのようなコードを書く本当の理由がないことはわかっていますが、なぜクラッシュしているのか疑問に思っていました。
私の最初の推測は、printコマンドstdoutがオーバーライドされているために失敗し、例外を発生させようとしているときに、オーバーライドされているために別の例外が発生したということstderrでした。

そのため、例外を発生させようとしているときにスタック オーバーフローが発生します。

ここでバックグラウンドで実際に何が起こっているのか、誰か説明できますか?
これはスタックオーバーフローですか?

4

1 に答える 1

5

が に設定されているため、printステートメントは例外をスローします。sys.stdoutNone

>>> 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この状況は、関数の特殊なケースです:

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

stderrここで、Python はオリジナル(OS によって Python に渡されたものであり、 ではなく) にメッセージを書き込み、sys.stderr実際に何が問題なのかを伝えることができなかったことを知らせます。

これはクラッシュではなく、状況を適切に処理する Python です。

于 2014-02-18T11:52:20.263 に答える