Python - 如何抓住破损的管道
Posted
技术标签:
【中文标题】Python - 如何抓住破损的管道【英文标题】:Python - How to catch a broken pipe 【发布时间】:2011-06-30 15:24:02 【问题描述】:我刚刚了解了 SIGPIPE,然后阅读了如何在 Python 中处理这些。
在其他来源中,我已阅读:How to handle a broken pipe (SIGPIPE) in python?
假设管道读取脚本退出,那么所有答案都表明写入脚本将其写入调用包装在 try 子句中。
但是,我无法完成这项工作。这是我的代码:
# printer.py
import time
try:
for i in range(10):
time.sleep(1)
print i
except:
print 'We caught the problem'
和
#nonreader.py
#read nothing, but stay alive for 5 sec
import time, sys
time.sleep(5)
sys.exit(0)
在外壳中:
$ python printer.py | python nonreader.py
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
显然,什么都没抓到。此外,当它打印“原始异常是:”时,它看起来真的错了,然后就没有了。
出了什么问题/我误解了什么?
托马斯
【问题讨论】:
【参考方案1】:由于您正在写入如此少量的数据,因此它们都被缓冲了,并且在文件关闭之前实际上没有任何内容写入管道。在关闭期间,尝试将数据写入管道,但失败了,但您的 try/except 子句已经完成。如果您在 try/except 期间刷新标准输出,您应该捕获错误。 (虽然,由于您在 except 子句中写入管道,因此您不会看到它!)
【讨论】:
有道理,谢谢 :) 但我不喜欢这个概念,即异常可能有点“发生在代码之后”。这样我就无法捕捉到那个异常。假设我不知道flush-thing,我只是想捕捉这个脚本中的任何问题,并将其写入日志。 该问题实际上与未能显式关闭文件有关。如果您关闭文件(而不是仅仅退出并让系统为您关闭它),您将在此时捕获错误。 感谢您的回答,在我的问题中,我所要做的就是刷新管道的写入端,然后关闭工作正常。以上是关于Python - 如何抓住破损的管道的主要内容,如果未能解决你的问题,请参考以下文章
MySQL数据库文件破损如何修复,.myi .myd .frm文件
subprocess.Popen 管道如何在 Python 中工作?