[Python] script bash-pipe compatibile

Pietro Battiston toobaz a email.it
Sab 24 Ott 2009 16:23:12 CEST


Il giorno sab, 24/10/2009 alle 14.32 +0200, Matteo Bertini ha scritto:
> Supponiamo di voler scrivere uno script python che consuma sys.stdin e 
> scrive su sys.stdout, ad esempio:
> 
> ###
> $ cat echo.py
> import sys
> for line in sys.stdin:
>      sys.stdout.write(line)
> ###
> 
> Purtroppo l'implementazione banale non si accoppia bene con altri tools 
> tipo 'head':
> 
> ###
> $ python -c "for x in range(200): print 'line'*(x+1)" | python echo.py | 
> head -5
> line
> lineline
> linelineline
> linelinelineline
> linelinelinelineline
> Traceback (most recent call last):
>    File "echo.py", line 5, in <module>
>      sys.stdout.write(line)
> IOError: [Errno 32] Broken pipe
> close failed in file object destructor: <---------- da qua in poi a 
> volte c'è a volte no
> Error in sys.excepthook:
> 
> Original exception was:
> ###
> 
> Ho provato un po' a giocare con try except senza però beccare il punto 
> giusto...



#! /usr/bin/python

import sys

while True:
        r = sys.stdin.readline()
        if not r:
            break
        try :
            sys.stdout.write(r)
        except:
            break


a me funziona...

in effetti, per i file grandi _non_ si arriva all'except, per i piccoli
sì, e non mi è chiaro perché.

Cioè: immagino che per i piccoli dopo che r contiene EOF e viene scritta
su stdout, poi stdout non vuole più "write".

Ma non capisco perché per i grandi invece non c'è l'exception.

boh

Pietro



Maggiori informazioni sulla lista Python