我正在尝试使用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(以防它可能很重要)。
答案 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时你应该获得大量的输出。