RuntimeError:丢失了sys.stdout

时间:2017-05-15 19:55:39

标签: python python-3.x cpython python-internals

我正在尝试使用abc.ABCMeta调试问题 - 特别是没有按预期工作的子类检查,我想首先向print添加__subclasscheck__方法(我知道有更好的方法来调试代码,但为了这个问题假装没有其他选择)。然而,当Python启动后,Python崩溃(如分段错误)我得到了这个例外:

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

所以将print置于其中并不是一个好主意。但是异常究竟来自哪里?我只更改了Python代码,不应该崩溃,对吧?

是否有人知道此异常的来源以及是否/如何避免此异常,但仍然在print方法中添加了abc.ABCMeta.__subclasscheck__

我正在使用Windows 10,Python-3.5(以防它可能很重要)。

1 个答案:

答案 0 :(得分:3)

此异常源于CPython imports io以及initialization of the standard streams期间间接garden.matplotlib的事实:

abc.py

if (!(iomod = PyImport_ImportModule("io"))) { goto error; } 导入io模块和registers FileIO作为abc的虚拟子类,其他几个类用于RawIOBase,其他用于BufferedIOBase }}。 TextIOBase在此过程中调用ABCMeta.register

根据您的理解,当__subclasscheck__ 不是设置时,print使用__subclasscheck__是一个很大的禁忌;初始化失败,你收到错误:

sys.stdout

您可以使用if (initstdio() < 0) Py_FatalError( "Py_NewInterpreter: can't initialize sys standard streams"); 来保护它,hasattr(sys, 'stdout')已被此点初始化,而sys没有(并且因此不存在)早期初始化阶段的stdout

sys

现在启动Python时你应该获得大量的输出。