2009-06-08 8 views
16

Estoy tratando de leer líneas de una tubería y procesarlas, pero estoy haciendo algo tonto y no puedo entender qué. El productor se va a mantener la producción de líneas de forma indefinida, así:Python - líneas simples de lectura de una tubería

producer.py

import time 

while True: 
    print 'Data' 
    time.sleep(1) 

El consumidor sólo tiene que comprobar periódicamente líneas:

consumer.py

import sys, time 
while True: 
    line = sys.stdin.readline() 
    if line: 
     print 'Got data:', line 
    else: 
     time.sleep(1) 

Cuando ejecuto esto en el shell de Windows como python producer.py | python consumer.py, simplemente duerme para siempre (¿parece que nunca se obtienen datos?) Parece que tal vez el problema es que ucer nunca termina, ya que si envío una cantidad finita de datos, funciona bien.

¿Cómo puedo obtener los datos que se recibirán y aparecerán para el consumidor? En la aplicación real, el productor es un programa C++ sobre el que no tengo control.

Respuesta

16

Algunas versiones antiguas de Windows simularon tuberías a través de archivos (por lo que eran propensas a tales problemas), pero eso no ha sido un problema en más de 10 años. Trate de añadir un

sys.stdout.flush() 

al productor después de la print, y también tratar de hacer que la salida estándar del productor sin búfer (mediante el uso de python -u).

Por supuesto, esto no ayuda si no tiene control sobre el productor; si almacena demasiado de su salida, todavía va a esperar mucho tiempo.

desgracia - mientras que hay muchos enfoques para resolver ese problema en los sistemas operativos basados ​​en Unix, como pyexpect, pexpect, exscript y paramiko, dudo que ninguno de ellos trabaja en Windows; si ese es realmente el caso, probaría Cygwin, que pone suficiente apariencia de Linux en Windows como para permitir a menudo el uso de enfoques similares a Linux en un cuadro de Windows.

7

Se trata de E/S que está búfer por defecto con Python. Pase -u opción para el intérprete para desactivar este comportamiento:

python -u producer.py | python consumer.py 

Se soluciona el problema para mí.

+0

¿Has leído la última oración de la pregunta? – jwg

Cuestiones relacionadas