2011-06-30 26 views
4

私はSIGPIPEについて学び、Pythonでこれらを処理する方法を読んでいます。他の情報源の中でPython - 壊れたパイプをキャッチする方法

、私が読んでいる:How to handle a broken pipe (SIGPIPE) in python?

はのは、パイプの読み取りスクリプトが終了としましょう、そしてすべての答えは、書き込みスクリプトは、try節での書き込みコールをwrappesことを示唆しています。

しかし、私はこの作業を行うことはできません。これは私のコードです:

# 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節はすでに完了しています。 try/except中にstdoutをフラッシュすると、エラーをキャッチする必要があります。 (あなたがexcept句のパイプに書いているので、あなたはそれを見ません!)

+0

それは意味があります、ありがとう:)しかし、私は例外が "コードの後に​​ "。そうすれば、私はその例外をキャッチする方法がありません。私はフラッシュのことを知らなかったとしましょう、私はちょうどこのスクリプトで何が問題をキャッチし、ログに書きたいと思ってみましょう。 –

+0

問題は、実際にファイルを明示的に閉じることに失敗したことに関連しています。ファイルを閉じると(単に終了してシステムを閉じさせるのではなく)、その時点でエラーをキャッチします。 –

+0

あなたの答えをありがとう、私がしなければならなかった私の問題では、パイプの書き込み終了をフラッシュし、その後、正常に動作しました。 – ihatecache

関連する問題