2009-06-08 11 views
16

Próbuję czytać linie z rury i przetwarzać je, ale robię coś głupiego i nie mogę się dowiedzieć co. Producent ma zamiar utrzymać produkcję linii w nieskończoność, tak:Python - proste linie odczytu z rury

producer.py

import time 

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

Konsument musi tylko sprawdzić linii okresowo:

consumer.py

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

Po uruchomieniu tego w powłoce systemu Windows jako python producer.py | python consumer.py, po prostu śpi na zawsze (nigdy nie wydaje się uzyskać danych?) Wydaje się, że może problem polega na tym, że prod ucer nigdy się nie kończy, ponieważ jeśli wyślę skończoną ilość danych, to działa dobrze.

Jak mogę uzyskać dane, które należy odebrać i pokazać je konsumentowi? W prawdziwej aplikacji producent jest programem w C++, nad którym nie mam kontroli.

Odpowiedz

16

Niektóre stare wersje systemu Windows symulowały potoki plików (więc były podatne na takie problemy), ale nie stanowiło to problemu od ponad 10 lat. Spróbuj dodać

sys.stdout.flush() 

do producenta po print, a także starać się stdout producenta za niebuforowana (przy użyciu python -u).

Oczywiście to nie pomoże, jeśli nie masz kontroli nad producentem - jeśli bufor będzie zbyt duży, nadal będziesz czekał długo.

Niestety - podczas gdy istnieje wiele sposobów, aby rozwiązać ten problem na uniksowych systemach operacyjnych, takich jak pyexpect, pexpect, exscript i paramiko wątpię, każdy z nich działa w systemie Windows; jeśli tak jest, chciałbym spróbować Cygwin, która umieszcza w systemie Windows wystarczającą ilość okleiny podobnej do Linuksa, która często umożliwia korzystanie z podejść podobnych do Linuksa w systemie Windows.

7

To dotyczy operacji we/wy, które są buforowane domyślnie w Pythonie. Przechodzą -u opcję do tłumacza, aby wyłączyć to zachowanie:

python -u producer.py | python consumer.py 

To rozwiązuje problem dla mnie.

+0

Czy przeczytałeś ostatnie zdanie pytania? – jwg