Ho sempre pensato che iterare su un file simile a Python equivalesse a chiamare il suo metodo readline
in un ciclo, ma oggi ho trovato una situazione in cui ciò non è vero. Specificamente, ho un processo Popen
'd p
doveDifferenza tra iterare su file e chiamare readline
list(itertools.takewhile(lambda x: x != "\n",
p.stdout))
hang (presumibilmente perché p
attende input, sia stdin
e stdout
sono tubi al mio processo pitone), mentre i seguenti lavori:
list(itertools.takewhile(lambda x: x != "\n",
iter(p.stdout.readline, "")))
Qualcuno può spiegare la differenza?
Nota a margine: invece di 'fiter()' si può usare 'iter (f.readline, None)', o anche 'iter (f.readline, "\ n")' 'per sostituire TakeWhile()'. –
Il problema che state vedendo è legato a buffer: 'file di .__ __ iter()' fa il buffering in qualche modo più aggressivo rispetto 'file.readline()' - che è anche il motivo per cui non si possono mescolare. Troppo pigro per la ricerca dei dettagli e trasformare questo in una risposta in questo momento ... –
@SvenMarnach: vuoi dire 'iter (f.readline, "")', ma sì, grazie, io continuo a dimenticare che :) –