how to handle broken pipes

Jorgen Grahn grahn+nntp at snipabacken.se
Wed Oct 14 16:39:01 EDT 2009


On Wed, 2009-10-14, Igor Mikushkin wrote:
> Hello all!
>
> Could anyone please say me what is the right way to handle broken
> pipes in Python?
> I can wrap all my print statements with try/except blocks but it looks
> like overkill for me.
>
> I'm using my Python script this way: my_script | less
> The script produces a lot of data.
> So usually when I find what I'm looking for and press 'q' script is
> still writing something.

You mean like this on Unix?

  python -c 'while 1: print "hello, world"'|less

which produces

  Traceback (most recent call last):
    File "<string>", line 1, in <module>
  IOError: [Errno 32] Broken pipe
  
Well, you can catch IOError, examine the errno, and do a sys.exit()
if it's EPIPE. Don't know if it should be sys.exit(0) or sys.exit(1)
though.

Oh, and *now* I see what you wrote at the top:

> I can wrap all my print statements with try/except blocks but it looks
> like overkill for me.

It's overkill if you have to do it for each print. You should always
(IMHO) wrap all your logic inside an object or a function, let's say
foo(). Then you only have to wrap the single call to foo().

There should be an even cleaner way. Mine is kind of ugly (catch,
examine, exit or re-raise) and it also incorrectly catches broken pipes
which aren't related to sys.stdout/stderr.

There is a similar problem with Ctrl-C, by the way -- the user gets a
KeyboardInterrupt exception thrown in his face where other languages
would have exited silently by default.

/Jorgen

-- 
  // Jorgen Grahn <grahn@  Oo  o.   .  .
\X/     snipabacken.se>   O  o   .



More information about the Python-list mailing list