[Python] script bash-pipe compatibile
Matteo Bertini
matteo a naufraghi.net
Sab 24 Ott 2009 16:29:12 CEST
Il 24/10/09 15.33, crap0101 ha scritto:
> Ho fatto qualche prova e così dovrebbe funzionare, ma penso anch'io che
> la soluzione migliore sia popen
>
> crap0101 a gNS01:~/Scrivania$ cat echo2.py
> import sys
>
> def gs ():
> for line in sys.stdin:
> yield line
>
>
> if __name__ == '__main__':
> try:
> sys.stdout.writelines (gs ())
> except IOError:
> pass
> crap0101 a gNS01:~/Scrivania$ python -c "for x in range(200): print
> 'line'*(x+1)" | python echo2.py | head -n 5
> line
> lineline
> linelineline
> linelinelineline
> linelinelinelineline
> crap0101 a gNS01:~/Scrivania$
>
Ok, problema caso semplice risolto!
Passiamo al caso reale, in realtà la funzione non è così inutile, ma è
banale mix tra sort e grep:
###
import sys
lines = []
for line in sys.stdin:
key = line.split()[0]
try:
lines.append((float(key), line))
except ValueError:
pass
try:
sys.stdout.writelines(line for _, line in sorted(lines))
except IOError:
pass
### <--- stesso comportamento scrivendolo con un for e
sys.stdout.write(line)
che ha come output (spesso...):
###
$ python -c "for x in range(400): print (x if x%10 else ''), 'line '*20"
> long.list && cat long.list | python bin/mlnsort.py | head -5 | sort -r
5 line line line line line line line line line line line line line line
line line line line line line
4 line line line line line line line line line line line line line line
line line line line line line
3 line line line line line line line line line line line line line line
line line line line line line
2 line line line line line line line line line line line line line line
line line line line line line
1 line line line line line line line line line line line line line line
line line line line line line
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
###
Per fortuna è su stderr, però mi stupisco non ci sia una soluzione pulita...
Maggiori informazioni sulla lista
Python