运行时错误:丢失系统标准输出

2024-05-16 04:14:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用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(以防万一可能很重要)。在


Tags: 方法代码inpylibsysline子类
1条回答
网友
1楼 · 发布于 2024-05-16 04:14:53

此异常源于CPython imports ^{},并且在initialization of the standard streams期间间接地,abc.py

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

ioabc模块和registers ^{}导入为RawIOBase的虚拟子类,BufferedIOBase的几个其他类和{}的其他类。ABCMeta.register调用进程中的__subclasscheck__。在

正如您所理解的,在__subclasscheck__中使用print,当sys.stdout不是设置时,使用print是一个很大的禁忌;初始化失败,您将返回错误:

^{pr2}$

您可以通过使用hasattr(sys, 'stdout')来保护它,sys已经在此时初始化,而{}还没有初始化(因此,在初始化的早期阶段,sys中不会存在):

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

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

相关问题 更多 >