Python - linhas de leitura simples de um tubo
-
12-09-2019 - |
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.
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.