2014-12-22 3 views
0

Я пытаюсь прочитать трубу в неблокирующем режиме. Вот аналогичный вопрос и ответ, но он использует потоки Non-blocking read on a subprocess.PIPE in pythonНеблокирующий ввод-вывод с тайм-аутом

Я пробовал следующее и выглядит проще, чем использование потоков, но не блокирует, только если вывод строки буферизирован - не уверен, что я делаю это неправильно, поэтому можно кто-то указал мне в правильном направлении?

#!/usr/bin/python 

import select 
from subprocess import * 
import time 

# do non-blocking read but timeout after some time as we don't want to poll forever 
timeout = 4 
READ_ONLY = select.POLLIN | select.POLLPRI | select.POLLHUP | select.POLLERR 

poller = select.poll() 
proc = Popen("./output.sh".split(), stdout=PIPE); 
poller.register(proc.stdout, READ_ONLY) 

now = time.time() 
end = now + timeout 

while time.time() < end: 
    if poller.poll(timeout): 
     # works as expected as long as output.sh produces lines 
     # read() also blocks 
     print "%s" % proc.stdout.readline(), 

proc.kill() 

output.sh является то, что генерирует выходные

#!/bin/bash 

for i in `seq 1 400`; 
do 
    sleep 1; 
    # doesn't have newlines 
    echo -n $i 
done 
+0

Я не уверен, что вы можете использовать readline() для неблокирующего ввода-вывода. Возможно, вам придется переключиться на использование read (1). – user590028

ответ

1

poll() функция означает, что вы, по крайней мере, один байт готов к чтению. Если вы вызываете readline(), вы будете ждать, пока не будет прочитана полная строка. Вам нужно вместо этого использовать read (1).

while time.time() < end: 
    if poller.poll(timeout): 
     # works as expected as long as output.sh produces lines 
     # read() also blocks 
     print "%s" % proc.stdout.read(1), 
Смежные вопросы