Я использую pty
для чтения неблокирующего stdout такого процесса:
import os
import pty
import subprocess
master, slave = pty.openpty()
p = subprocess.Popen(cmd, stdout = slave)
stdout = os.fdopen(master)
while True:
if p.poll() != None:
break
print stdout.readline()
stdout.close()
Все работает нормально, за исключением того, что while-loop
иногда блокируется. Это связано с тем, что строка print stdout.readline()
ожидает, что что-то будет прочитано из stdout
. Но если программа уже завершена, мой маленький скрипт там будет висеть вечно.
Мой вопрос: есть ли способ заглянуть в объект stdout
и проверить, есть ли данные, доступные для чтения? Если это не так, он должен продолжить через while-loop
, где обнаружит, что процесс на самом деле уже завершен, и разорвет цикл.
stdout.seek(1, os.SEEK_CUR)
исключение, и таким образом определить, есть ли доступные данные? - person Jacob   schedule 21.06.2011stdout.seek(1, os.SEEK_CUR)
выдает это исключение:IOError: [Errno 29] Illegal seek
- person Woltan   schedule 21.06.2011p.poll() is not None
(проверка идентичности объекта), а неp.poll() != None
(проверка равенства, менее точная и медленная). - person Chris Morgan   schedule 27.06.2011type(p) is subprocess.Popen
doc forsubprocess.Popen.poll()
is Проверить, не завершился ли дочерний процесс. Возвращает атрибут кода возврата. - person Dan D.   schedule 27.06.2011print stdout.readline()
, мой скрипт будет зависать до тех пор, пока некоторый вывод не будет записан вstdout
. Если процесс тем временем завершится, мой скрипт все равно зависнет. - person Woltan   schedule 27.06.2011