2017-05-15 30 views
2

abc.ABCMetaの問題をデバッグしようとしていました。特にサブクラスチェックが期待通りに機能しなかったため、print__subclasscheck__メソッドに追加するだけでした。コードをデバッグするより良い方法ですが、この問題のために代替手段はないとふります)。その後(セグメンテーションフォールトのような)Pythonのクラッシュ私はこの例外を取得するのPythonを起動したときしかし:RuntimeError:lost sys.stdout

Fatal Python error: Py_Initialize: can't initialize sys standard streams 
Traceback (most recent call last): 
    File "C:\...\lib\io.py", line 84, in <module> 
    File "C:\...\lib\abc.py", line 158, in register 
    File "C:\...\lib\abc.py", line 196, in __subclasscheck__ 
RuntimeError: lost sys.stdout 

をだからprobeblyそこにprintを置くのは良い考えではありませんでした。しかし例外はどこから来ますか?私はPythonコードを変更しただけで、クラッシュしないはずです。

誰かがこの例外がどこから来たのか、それを回避できるかどうかを知っていますが、メソッドにはまだprintを入れていますか?

私はWindows 10、Python-3.5を使用しています(重要な場合があります)。

答えて

3

この例外は、間接的にはCPython imports io、および、abc.pyそのinitialization of the standard streams中に事実に由来する:

if (!(iomod = PyImport_ImportModule("io"))) { 
    goto error; 
} 

ioRawIOBaseの仮想サブクラス、他のクラスのカップルのためとしてabcモジュールとregisters FileIOをインポートBufferedIOBaseなど、TextIOBaseです。 ABCMeta.registerは、プロセス中で__subclasscheck__を呼び出します。あなたが理解したよう

sys.stdoutセットアップでない場合__subclasscheck__printを使用すると、大きなノーノーです。初期化が失敗し、あなたはあなたのエラーを取り戻す:

if (initstdio() < 0) 
    Py_FatalError(
     "Py_NewInterpreter: can't initialize sys standard streams"); 

あなたはhasattr(sys, 'stdout')sysとそれを守ることによってそれを回避することができますstdoutはしていない(と、のような、ありませんが、この時点で初期化されています)初期の初期化フェーズでsysに存在する:

if hasattr(sys, 'stdout'): 
    print("Debug") 

今のPythonを発射したときに、出力の良い量を取得する必要があります。

関連する問題