2009-06-08 6 views
16

Ich versuche, Linien aus einer Leitung zu lesen und zu verarbeiten, aber ich mache etwas albern und ich kann nicht herausfinden, was. Der Produzent wird sich halten Linien auf unbestimmte Zeit, wie diese produziert:Python - einfaches Lesen von Linien aus einem Rohr

producer.py

import time 

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

Der Verbraucher muss nur regelmäßig auf Linien überprüfen:

consumer.py

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

Wenn ich dies in der Windows-Shell als python producer.py | python consumer.py ausführen, schläft es einfach für immer (scheint nie Daten zu bekommen?) Es scheint, dass das Problem vielleicht ist, dass der Prod ucer wird nie beendet, denn wenn ich eine endliche Menge an Daten sende, funktioniert es gut.

Wie kann ich die Daten erhalten und für den Verbraucher angezeigt werden? In der realen Anwendung ist der Produzent ein C++ - Programm, über das ich keine Kontrolle habe.

Antwort

16

Einige alte Versionen von Windows simulierten Pipes durch Dateien (also waren sie anfällig für solche Probleme), aber das war in 10+ Jahren kein Problem. Versuchen Sie, ein

sys.stdout.flush() 

den Erzeuger nach den print Zugabe, und auch versuchen, den Herstellers stdout ungepufferte zu machen (durch python -u verwenden).

Natürlich hilft das nicht, wenn Sie keine Kontrolle über den Hersteller haben - wenn es zu viel von seiner Ausgabe puffert, werden Sie immer noch lange warten.

Leider - während es viele Ansätze, dieses Problem auf Unix-ähnlichen Betriebssystemen, wie zum Beispiel pyexpect zu lösen, pexpect, exscript und paramiko, bezweifle ich, jeder von ihnen auf Windows funktioniert; Wenn das in der Tat der Fall ist, würde ich Cygwin versuchen, die genug von einem Linux-ähnlichen Furnier auf Windows legt, um oft die Verwendung von Linux-ähnlichen Ansätzen auf einer Windows-Box zu ermöglichen.

7

Dies ist über E/A, die standardmäßig mit Python gepuffert ist. Pass -u Option zum Interpreter dieses Verhalten zu deaktivieren:

python -u producer.py | python consumer.py 

Es behebt das Problem für mich.

+0

Haben Sie den letzten Satz der Frage gelesen? – jwg