Есть ли способ опроса дескриптора файла, возвращенного из subprocess.Popen? - PullRequest
4 голосов
/ 19 мая 2009

Скажи, что я пишу это:

from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)

Теперь, если я сделаю

line = p.stdout.readline()

моя программа ждет, пока подпроцесс выведет следующую строку.

Есть ли какая-нибудь магия, которую я могу сделать для p.stdout, чтобы я мог прочитать вывод, если он есть, но просто продолжить иначе? Я ищу что-то вроде Queue.get_nowait()

Я знаю, что могу просто создать поток для чтения p.stdout, но давайте предположим, что я не могу создавать новые темы.

Ответы [ 2 ]

8 голосов
/ 19 мая 2009

Используйте 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()
5 голосов
/ 19 мая 2009

Используйте модуль select в стандартной библиотеке Python, см. http://docs.python.org/library/select.html. select.select([p.stdout.fileno()], [], [], 0) немедленно возвращает кортеж, элементы которого представляют собой три списка: первый будет непустым, если есть что прочитать в этом дескрипторе файла.

...