2013-03-27 8 views
5

Mam następujący kod w program.py:sys.stdin nie zamyka na Ctrl-D

from sys import stdin 
for line in stdin: 
    print line 

biegnę, wprowadź linii, a następnie naciśnij Ctrl+ D, ale program nie wychodzi.

to działa:

$ printf "echo" | python program.py 

Dlaczego nie zakończyć program po naciśnięciu Ctrl + d? Używam terminala Fedory 18.

+0

Jaką powłokę używasz? – squiguy

+0

Aha, i musisz dwukrotnie wprowadzić "CTRL-D". –

+0

Dwukrotne wejście do CTRL-D 2 nie działa. –

Odpowiedz

13

Ctrl + D ma dziwny wpływ. Nie zamyka strumienia wejściowego, ale tylko powoduje, że poziom C fread() zwraca pusty wynik. W przypadku zwykłych plików taki wynik oznacza, że ​​plik jest już na końcu, ale można przeczytać więcej, np. aby sprawdzić, czy ktoś w międzyczasie napisał więcej danych do pliku.

Ponadto istnieją problemy z buforowaniem --- trzy poziomy z nich!

  • Pythonowa iteracja pliku blokuje buforowanie. Unikaj czytania z interaktywnych strumieni.

  • Plik stdin poziomu C ma domyślnie bufor linii.

  • sam zacisk (!), W trybie domyślnym („tryb gotowane”), odczytuje jedną linię danych przed wysłaniem go do procesu, co wyjaśnia, dlaczego wpisując Ctrl + D nie ma dowolny efekt po wpisaniu w środku linii.

Ten przykład unika się pierwszy problem, który jest wszystko, czego potrzebujesz, jeśli chcesz to wykrywanie Ctrl + D wpisane jako własnej linii:

import sys 

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

Ci co linię ostateczny '\n', z wyjątkiem sytuacji, gdy "linia" pochodzi od Ctrl + D, w takim przypadku otrzymasz tylko '' (ale czytanie trwa, chyba że oczywiście dodajemy if line == '': break).

Powiązane problemy