13

出力を stdout に書き込む Python3 スクリプトがありますが、その出力を head または tail にパイプするとエラーが発生します。head以下のサンプル出力では、要求どおりに最初の 2 行の出力が返されていることに注意してください。

> ./script.py '../Testdata/*indels.ss' -m 5 | head -2                                                                                              ~/Databases/Avian_genomes/Sandbox/combined
xread
2999 50
Traceback (most recent call last):
  File "./new.py", line 194, in <module>
    sys.stdout.write(lineout)
IOError: [Errno 32] Broken pipe
Exception IOError: IOError(32, 'Broken pipe') in <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored

対照的に、スクリプトは、以下のように出力が awk にパイプされることに問題はありません。

> ./script.py '../Testdata/*indels.ss' -m 5 | awk 'NR < 3 {print $0}'                                                                              ~/Databases/Avian_genomes/Sandbox/combined
xread
2999 50

エラー メッセージに含まれているコード以外にスクリプトのコードが必要な場合はお知らせください。何が関係するのかわかりません。

4

2 に答える 2

14
./script.py '../Testdata/*indels.ss' -m 5 | awk 'NR >= 3 {exit} 1'

と同じ動作を示しhead -2ます。

SIGPIPE代わりに、プログラムを静かに強制終了するハンドラーを設定することができます。

import signal
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
于 2012-07-10T23:11:21.337 に答える
10

ここから引用します

コマンドのシーケンスがパイプラインに表示され、そのうちの 1 つが

書き込みコマンドが終了する前に読み取りコマンドが終了すると、

writer は SIGPIPE シグナルを受け取ります。

それheadがそうです。あなたのスクリプトは書き終わっていませんが、headすでに完了しているためstdout、閉じられているため、例外が発生します。

于 2012-07-10T23:10:40.943 に答える