[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