pythonpython-3.xsigpipe

IOError: [Errno 32] Broken pipe when piping: `prog.py | othercmd`


I have a very simple Python 3 script:

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()

But it always says:

IOError: [Errno 32] Broken pipe

I saw on the internet all the complicated ways to fix this, but I copied this code directly, so I think that there is something wrong with the code and not Python's SIGPIPE.

I am redirecting the output, so if the above script was named "open.py", then my command to run would be:

open.py | othercommand

Solution

  • I haven't reproduced the issue, but perhaps this method would solve it: (writing line by line to stdout rather than using print)

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

    You could catch the broken pipe? This writes the file to stdout line by line until the pipe is closed.

    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
    

    You also need to make sure that othercommand is reading from the pipe before it gets too big - https://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer