Как читать из os.pipe() без блокировки?

Я пытаюсь читать из открытого os.pipe(), чтобы увидеть, пуст ли он в момент чтения. Проблема заключается в том, что вызов read() заставляет программу блокировать его до тех пор, пока на самом деле не будет чего-то читать, но их не будет, если тест, который я делаю, преуспел.

Я знаю, что могу использовать select.select() с тайм-аутом, но я хотел знать, есть ли другое решение проблемы.

Ответ 1

Вы можете попробовать это.

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

При этом thePipe.read() должен быть неблокирующим.

Из pipe (7) man page:

Если процесс пытается прочитать из пустой канал, затем прочитайте (2), чтобы заблокировать пока данные не будут доступны. (...) Неблокирующий ввод-вывод возможен, используя операция fcntl (2) F_SETFL для включить статус открытого файла O_NONBLOCKфлаг.