Есть ли способ опроса дескриптора файла, возвращаемого из подпроцесса .Popen?
Скажем, я пишу это:
from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
Теперь, если я делаю
line = p.stdout.readline()
моя программа ждет, пока подпроцесс не выведет следующую строку.
Есть ли какая-либо магия, которую я могу сделать для p.stdout
, чтобы я мог читать вывод, если он есть, но просто продолжать иначе? Я ищу что-то вроде Queue.get_nowait()
Я знаю, что могу просто создать поток для чтения p.stdout
, но предположим, что я не могу создавать новые потоки.
Ответы
Ответ 1
Используйте модуль select
в стандартной библиотеке Python, см. http://docs.python.org/library/select.html. select.select([p.stdout.fileno()], [], [], 0)
немедленно возвращает кортеж, элементы которого состоят из трех списков: первый из них будет непустым, если есть что-то для чтения в этом файловом дескрипторе.
Ответ 2
Используйте p.stdout.read(1)
, это будет читать символ по символу
И вот полный пример:
import subprocess
import sys
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()