Pregunta

Estoy tratando de leer las líneas de una tubería de proceso y de ellos, pero yo estoy haciendo algo tonto y que no puedo averiguar qué.El productor se va a seguir produciendo líneas indefinidamente, como este:

producer.py

import time

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

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

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, que sólo duerme para siempre (nunca parece terminar de datos?) Parece que tal vez el problema es que el productor nunca termina, ya que si me envían una cantidad finita de datos, a continuación, funciona bien.

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

¿Fue útil?

Solución

Algunas versiones antiguas de Windows simulado tuberías a través de los archivos (de modo que eran propensos a estos problemas), pero que no ha sido un problema en más de 10 años.Trate de añadir un

  sys.stdout.flush()

para el productor, después de la print, y también tratar de hacer del productor stdout sin memoria intermedia (por el uso de python -u).

Por supuesto, esto no ayuda, si usted no tiene ningún control sobre el productor, si búferes demasiado de su resultado, usted todavía va a esperar mucho tiempo.

Por desgracia - mientras que hay muchos enfoques para resolver ese problema en los sistemas operativos tipo Unix, como pyexpect, pexpect, exscript, y paramiko, Dudo que alguno de ellos funciona en Windows;si ese es el caso, me gustaría probar Cygwin, que pone suficiente de Linux como de chapa en Windows como a menudo permiten el uso de Linux como enfoques en un cuadro de Windows.

Otros consejos

Esto se trata de I / O que se bufferized por defecto con Python. -u opción de pasar al intérprete para desactivar este comportamiento:

python -u producer.py | python consumer.py

Se soluciona el problema para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top