【问题标题】:RuntimeError: lost sys.stdout运行时错误:丢失 sys.stdout
【发布时间】:2017-10-14 17:25:38
【问题描述】:

我试图调试 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 代码,应该不会崩溃吧?

有人知道这个异常来自哪里以及我是否/如何避免它但仍然在abc.ABCMeta.__subclasscheck__ 方法中放置print

我使用的是 Windows 10,Python-3.5(以防万一它可能很重要)。

【问题讨论】:

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


    【解决方案1】:

    此异常源于 CPython imports io 以及 abc.pyinitialization of the standard streams 期间的间接原因:

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

    io 导入abc 模块和registers FileIO 作为RawIOBase 的虚拟子类,BufferedIOBase 的几个其他类和TextIOBase 的其他类。 ABCMeta.register 在过程中调用__subclasscheck__

    如您所知,在 __subclasscheck__ 中使用 print sys.stdout 不是 设置是一个很大的禁忌;初始化失败,你得到你的错误:

    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 时应该会获得大量输出。

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2020-04-13
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多