2013-06-02 7 views
2

Un programme imprime en continu sur la sortie standard une ligne à la fois. J'essaie de lire et de traiter une ligne à la fois de cette entrée sans avoir à attendre que le programme se termine. Par exemple, writeOutput.py ci-dessous écrit une ligne à la fois sur stdout (en attente entre chaque ligne entre 1 et 3 secondes).Lecture stdin asynchrone en Python

L'appel ./writeOutput.py | ./processEachLine.py nécessite writeOutput.py pour terminer avant que processEachLine.py puisse commencer à traiter la première ligne.

Y a-t-il un moyen d'y parvenir en python? Même en appelant writeOutput.py directement dans le programme python au lieu d'utiliser un tube?

Toute aide serait grandement appréciée.

writeOutput.py

#!/usr/bin/env python 
import random 
import time 

i = 0 
while i < 5: 
    n = int(1 + (random.random()*10) % 3) 
    i += 1 
    time.sleep(n) 
    print(str(n) + " test") 

processEachLine.py

#!/usr/bin/env python  
import sys 

while 1: 
    line = sys.stdin.readline() 
    if not line: 
     break 
    print(">>" + line) 

Répondre

3

Au lieu de

#!/usr/bin/env python 

utilisation

#!/usr/bin/env python -u 
+0

Merci. #!/Usr/bin/env python -u créerait une erreur: "/ usr/bin/env: python -u: Aucun fichier ou répertoire" Une solution de contournement consiste à utiliser python -u writeOutput.py | python -u processEachLine.py Ou ajoutez #!/usr/bin/python -u Merci beaucoup pour l'aide. – tartifletteblvd

+0

C'est étrange, ça marche bien pour moi (essayé sur OS X et Linux). Quel système d'exploitation êtes-vous? – uselpa

+0

Ceci est probablement necro, mais le tiret est probablement mauvais - réussi à recréer l'erreur en copiant le tiret du commentaire de tartifletteblvd – Nitz