1. ホーム
  2. python

[解決済み] IOErrorです。[Errno 32] パイプ接続時にパイプが壊れました。`prog.py | othercmd` です。

2022-01-31 14:40:49

質問

非常にシンプルなPython 3スクリプトを持っています。

f1 = open('a.txt', 'r')
print(f1.readlines())
f2 = open('b.txt', 'r')
print(f2.readlines())
f3 = open('c.txt', 'r')
print(f3.readlines())
f4 = open('d.txt', 'r')
print(f4.readlines())
f1.close()
f2.close()
f3.close()
f4.close()

でも、いつも書いてある。

IOError: [Errno 32] Broken pipe

ネット上では複雑な解決方法が書かれていますが、私はこのコードをそのままコピーしたので、PythonのSIGPIPEではなく、コードに何か問題があるのではと思います。

私は出力をリダイレクトしているので、もし上記のスクリプトが "open.py" という名前だったら、私の実行するコマンドは次のようになります。

open.py | othercommand

解決方法は?

再現はしていませんが、もしかしたらこの方法で解決するかもしれません。 stdout を使用するのではなく print )

import sys
with open('a.txt', 'r') as f1:
    for line in f1:
        sys.stdout.write(line)


壊れたパイプをキャッチできる?これは、ファイルを stdout パイプが閉じるまで一行ずつ

import sys, errno
try:
    with open('a.txt', 'r') as f1:
        for line in f1:
            sys.stdout.write(line)
except IOError as e:
    if e.errno == errno.EPIPE:
        # Handle error

また othercommand が大きくなりすぎる前に、パイプから読み込んでいます。 https://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer