Tengo un problema para leer desde entrada estándar o pipe en python cuando la tubería es de un archivo "abierto" (no sé el nombre correcto) .¿Cómo se lee desde stdin en python desde una tubería que no tiene final
que tienen como ejemplo pipetest.py:
import sys
import time
k = 0
try:
for line in sys.stdin:
k = k + 1
print line
except KeyboardInterrupt:
sys.stdout.flush()
pass
print k
corro un programa que tenga continúa la producción y Ctrl + C después de un tiempo
$ ping 127.0.0.1 | python pipetest.py
^C0
consigo ninguna salida. Pero si uso un archivo normal, funciona.
$ ping 127.0.0.1 > testfile.txt
esto se terminó con Ctrl + C después de un corto periodo de tiempo
$ cat testfile.txt | python pipetest.py
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.015 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.014 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.013 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.012 ms
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 0.012/0.014/0.017/0.003 ms
10
¿Cómo hago para obtener cualquier salida antes de que termine el programa, en este caso de ping ha terminado?
Me alegro de que funcionó, pero ciertamente puede usar 'for line in stdin', siempre que sepa que bloqueará hasta que encuentre un final de línea (por lo que su versión funciona,' leer' no bloquea así). – agf
No sugiero que borres tu respuesta, solo que la última línea fue incorrecta. Eliminé el comentario "totalmente incorrecto" porque era incorrecto: su programa era correcto, solo que su declaración de cierre fue incorrecta. No soy el infractor (no lo sería, ya que no sabía si su respuesta funcionaría o no). – agf