Pergunta

Eu estou tentando ler linhas de um tubo e processá-los, mas eu estou fazendo algo bobo e eu não consigo descobrir o que. O produtor vai manter produzindo linhas indefinidamente, como este:

producer.py

import time

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

O consumidor só precisa verificar se há linhas periodicamente:

consumer.py

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

Quando eu executo isso no shell do Windows como python producer.py | python consumer.py, ele só dorme para sempre (nunca parece obter dados?) Parece que talvez o problema é que o produtor não termina, uma vez que, se eu enviar uma quantidade finita de dados, em seguida, funciona bem.

Como posso obter os dados a serem recebidos e mostrar-se para o consumidor? Na aplicação real, o produtor é um programa em C ++ Eu tenho nenhum controle sobre.

Foi útil?

Solução

Algumas versões antigas do Windows simulado tubos através de arquivos (para que eles eram propensos a esses problemas), mas isso não tem sido um problema em 10+ anos. Tente adicionar um

  sys.stdout.flush()

para o produtor após a print, e também tentar fazer stdout do produtor sem buffer (usando python -u).

É claro que isso não ajuda se você não tem nenhum controle sobre o produtor -. Se ele buffers muito de sua saída você ainda vai esperar um longo tempo

Infelizmente - embora existam muitas abordagens para resolver esse problema em Unix-like sistemas operacionais, tais como pyexpect, pexpect , exscript , e paramiko , duvido qualquer um deles funciona no Windows; se isso é realmente o caso, eu tentaria Cygwin , o que coloca o suficiente de um Linux-como verniz no Windows como a muitas vezes permitem o uso de Linux-like abordagens sobre uma caixa de Windows.

Outras dicas

Trata-se de I / O que é tamponizado por padrão com o Python. opção -u passar para o intérprete para desativar esse comportamento:

python -u producer.py | python consumer.py

Ela corrige o problema para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top