2009-03-23 6 views
8

Próbuję odczytać z otwartego os.pipe(), aby zobaczyć, czy jest pusty w momencie czytania. Problem polega na tym, że wywołanie read() powoduje, że program blokuje się tam, dopóki nie będzie czegoś, co można tam odczytać, jednak nie będzie żadnego, jeśli test, który wykonuję, zakończył się powodzeniem.Jak czytać z os.pipe() bez blokowania?

Wiem, że mogę używać select.select() z limitem czasu, ale chciałem wiedzieć, czy istnieje inne rozwiązanie tego problemu.

Odpowiedz

14

Możesz spróbować tego.

import os, fcntl 
fcntl.fcntl(thePipe, fcntl.F_SETFL, os.O_NONBLOCK) 

Tym numerem thePipe.read() nie należy blokować.

Od strony pipe(7) człowieka:

Jeśli proces próbuje odczytać z pustej rury, a następnie odczytać (2) blokuje aż dane. (...) Non-blocking I/O jest możliwe przy użyciu operacji fcntl (2) F_SETFL do włączenia flagi stanu otwartego pliku o wartości .

+1

Dziękuję bardzo. Dokładnie tego potrzebowałem. – mpeterson

+1

Yesssss! Dziękuję Ci! – juliomalegria

+0

uwaga: metody plików takie jak '.readline()' mogą nie oczekiwać trybu bez blokowania. – jfs