4

SIGPIPEについて学び、Pythonでこれらを処理する方法について読みました。

他の情報源の中で、私は読んだ:Pythonで壊れたパイプ(SIGPIPE)を処理する方法は?

パイプ読み取りスクリプトが終了すると、すべての回答は、書き込みスクリプトが書き込み呼び出しを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

1 に答える 1

5

このような少量のデータを書き込んでいるため、すべてのデータがバッファリングされ、ファイルが閉じられるまで実際には何もパイプに書き込まれません。クローズ中に、パイプにデータを書き込もうとしましたが、失敗しましたが、try/except句はすでに実行されています。試行/例外中にstdoutをフラッシュする場合は、エラーをキャッチする必要があります。(ただし、except句でパイプに書き込んでいるため、表示されません!)

于 2011-06-30T16:31:23.137 に答える