【问题标题】:Errors at Python program exit: "close failed in file object destructor"; "sys.excepthook is missing"Python 程序退出时出错:“文件对象析构函数中的关闭失败”; “sys.excepthook 丢失”
【发布时间】:2017-03-10 15:48:18
【问题描述】:

在我的 python 代码的最后一行(打印语句)之后,我收到以下错误:

close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

有人知道这可能来自哪里吗?

更新:我的 python 代码非常长,但我将发布可能与此错误有关的部分:

首先,在流程开始时,我将 stdout 和 stderr 重定向到这样的日志文件:

so = se = open(logfile, 'w', 0)                       
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) 
os.dup2(so.fileno(), sys.stdout.fileno())           
os.dup2(se.fileno(), sys.stderr.fileno())

虽然我一直这样做,但从未遇到此错误,但这似乎是我看到此错误的最可能原因。

【问题讨论】:

  • 调用程序时出现错误(stderr)流怎么办?
  • 您是否正在导入您自己编写的名为 sys 的模块?
  • 我认为错误可能来自您的代码,但由于您没有向我们展示任何内容,因此世界可能永远不会知道。
  • @jwodder 哈哈,代码超长,我不知道哪些部分与此错误相关,所以我没有发布任何内容
  • 验证您发布的部分实际上足以重现问题。有关创建M初始、C完整、V可验证E示例的规则,请参阅stackoverflow.com/help/mcve。是的,这意味着在提出问题之前您需要自己做一些工作。

标签: python linux sys


【解决方案1】:

在我的 main 函数的最后添加以下语句为我解决了这个问题:

try:
    sys.stdout.close()
except:
    pass
try:
    sys.stderr.close()
except:
    pass

【讨论】:

    【解决方案2】:

    冲洗和关闭对我有用。

    sys.stdout.flush()
    sys.stdout.close()
    
    sys.stderr.flush()
    sys.stderr.close()
    

    【讨论】:

    • user20408 的回答对我有用。这个答案也有效,并通过新的错误消息阐明:sys.stdout.flush() IOError: [Errno 32] Broken pipe
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2014-02-26
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多