我试着用abc.ABCMeta
调试一个问题,特别是一个没有按预期工作的子类检查,我想从简单地向__subclasscheck__
方法中添加一个print
开始(我知道有更好的方法来调试代码,但是为了这个问题假装没有其他选择)。<然后启动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代码,不会崩溃吧?在
有人知道这个异常是从哪里来的吗?如果/我可以避免它,但是仍然在abc.ABCMeta.__subclasscheck__
方法中加一个print
?在
我使用的是windows10,Python-3.5(以防万一可能很重要)。在
此异常源于CPython imports ^{} ,并且在initialization of the standard streams期间间接地,
abc.py
:io
将abc
模块和registers ^{RawIOBase
的虚拟子类,BufferedIOBase
的几个其他类和{ABCMeta.register
调用进程中的__subclasscheck__
。在正如您所理解的,在
^{pr2}$__subclasscheck__
中使用print
,当sys.stdout
不是设置时,使用print
是一个很大的禁忌;初始化失败,您将返回错误:您可以通过使用}还没有初始化(因此,在初始化的早期阶段,
hasattr(sys, 'stdout')
来保护它,sys
已经在此时初始化,而{sys
中不会存在):现在启动Python时应该可以获得大量的输出。在
相关问题 更多 >
编程相关推荐