2013-03-27 11 views
5

ho il seguente codice nel program.py:sys.stdin non chiude il CTRL-D

from sys import stdin 
for line in stdin: 
    print line 

corro, inserire linee, e quindi premere Ctrl + D, ma il programma non esce.

Questo funziona:

$ printf "echo" | python program.py 

Perché il programma non uscire quando premo Ctrl +d? Sto usando il terminale Fedora 18.

+0

Quale shell stai usando? – squiguy

+0

Oh, e devi inserire 'CTRL-D' due volte. –

+0

E l'inserimento di 'CTRL-D' due volte non funziona. –

risposta

13

Ctrl + D ha uno strano effetto. Non chiude il flusso di input, ma causa solo un livello C fread() per restituire un risultato vuoto. Per i file regolari, un risultato di questo tipo indica che il file è ora alla sua fine, ma è accettabile leggere altro, ad es. per verificare se qualcun altro ha scritto più dati nel file nel frattempo.

Inoltre, ci sono problemi di buffering --- tre livelli di questi!

  • L'iterazione di Python su un file blocca il buffering. Evitalo per leggere da flussi interattivi.

  • il file stdin di livello C ha, per impostazione predefinita, un buffer di riga.

  • terminale stesso (!), Nella sua modalità di default ("modalità cotto"), si legge una riga di dati prima di inviarli al processo, il che spiega il motivo per cui digitando Ctrl +D non ha qualsiasi effetto quando digitato nel mezzo di una linea.

Questo esempio evita il primo numero, che è tutto ciò che serve, se invece si sta rilevando Ctrl + D digitato come una propria linea:

import sys 

while True: 
    line = sys.stdin.readline() 
    print repr(line) 

si ottiene ogni linea con un '\n' finale, a parte quando la "linea" viene da un Ctrl + D, nel qual caso si ottiene solo '' (ma la lettura continua, a meno che, naturalmente, aggiungiamo if line == '': break).

Problemi correlati