[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