sys.stdin no se cierra en ctrl-d

Tengo el siguiente código en program.py:

from sys import stdin for line in stdin: print line 

Ejecuto, ingreso líneas y luego presiono Ctrl + D , pero el progtwig no se cierra.

Esto funciona:

 $ printf "echo" | python program.py 

¿Por qué el progtwig no sale cuando presiono Ctrl + d ? Estoy usando el terminal Fedora 18.

Ctrl + D tiene un efecto extraño. No cierra el flujo de entrada, pero solo hace que un fread() nivel C devuelva un resultado vacío. Para los archivos normales, un resultado de este tipo significa que el archivo se encuentra al final, pero es aceptable leer más, por ejemplo, para verificar si alguien más escribió más datos en el archivo mientras tanto.

Además, hay problemas de almacenamiento en búfer: ¡tres niveles de ellos!

  • La iteración de Python sobre un archivo bloquea el búfer. Evitarlo para leer desde secuencias interactivas.

  • El archivo estándar de nivel C tiene, de forma predeterminada, un búfer de línea.

  • el propio terminal (!), en su modo predeterminado (“modo cocinado”), lee una línea de datos antes de enviarlo al proceso, lo que explica por qué escribir Ctrl + D no tiene ningún efecto cuando se escribe en medio de una línea.

Este ejemplo evita el primer problema, que es todo lo que necesita si lo único que desea es detectar Ctrl + D escrito como su propia línea:

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

Obtiene todas las líneas con un '\n' final, aparte de cuando la “línea” proviene de un Ctrl + D , en cuyo caso solo obtiene '' (pero la lectura continúa, a menos que, por supuesto, agreguemos if line == '': break ).