2010-11-15 18 views
7

Sto cercando di convertire l'output di vmstat in un file CSV utilizzando Python, così ho usare qualcosa di simile per convertire in formato CSV e aggiungere la data e l'ora come coloumns:tubi in streaming in Python

vmstat 5 | python myscript.py >> vmstat.log 

Il problema che sto riscontrando è che blocca durante il tentativo di iterare sys.stdin. Sembra che il buffer di input non venga scaricato. Non voglio passare all'infinito e masterizzare il tempo del processore mentre sto provando a misurarlo. Ecco una semplice dimostrazione che blocca sulla linea 3:

import sys 

for line in sys.stdin: 
    sys.stdout.write(line) 
    sys.stdout.flush() 

C'è un modo semplice per accedere al flusso immediatamente come grep fa, senza pause mentre il buffer di input si riempie?

risposta

7

VMstat 5, non chiude lo stdout, quindi il buffer python è ancora in attesa di altri dati.

Utilizzare questo invece:

for line in iter(sys.stdin.readline, ""): 
    print line 
+0

grep può farlo, ad esempio 'vmstat 5 | grep 0' stamperà felicemente le righe che contengono uno 0 allo stdout –

+2

Sì, è necessario solo cambiare il modo in cui legge dallo stdin vedere edit – fabrizioM

+1

Questa soluzione funziona, grazie! –