2011-06-30 37 views
4

我刚刚了解了SIGPIPE,然后阅读了如何在Python中处理这些信息。Python - 如何捕捉破损的管道

在其他来源,我已阅读:How to handle a broken pipe (SIGPIPE) in python?

假设管道读脚本退出,那么所有的答案提示,写脚本wrappes在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: 

显然,没有被抓住了。此外,它看起来确实是错误的,当它打印'原始异常是:',然后没有更多。

什么是错误的/我误解了什么?

托马斯

回答

4

既然你写这样的数据量小,它是所有缓存,并没有什么实际写入到管道,直到该文件被关闭。在结束时,试图将数据写入管道,但失败,但您的try/except子句已完成。如果在尝试/除外期间刷新stdout,则应该捕获错误。 (虽然,因为你写的除了从句的管道,你不会看到它!)

+0

这很有道理,谢谢:)但我不喜欢这个概念,一个异常可以排序“发生在代码之后“。这样我就无法捕捉到这个异常。比方说,我不知道刷新事件,我只是想在这个脚本中发现任何问题,并将它写入日志。 –

+0

该问题实际上与无法明确关闭该文件有关。如果关闭该文件(而不是仅仅退出并让系统关闭它),那么您将在该点发现错误。 –

+0

感谢您的回答,在我的问题中,我所要做的只是刷新管道的写入端,然后关闭工作正常。 – ihatecache