Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2012 21:43:39

larmor
Зарегистрирован: 2012-10-27
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess.Popen, stdout и stderr

Требуется обработать stdout и stderr запущеного процесса, вывести на экран, записать в файл, отправить по сети, что-то сделать при получении чего-то.
Придумал такой вариант (с коментариями):

def outTimer(process):
    work = True
    # открыть файл
    while work:
        output = process.stdout.readline() # висит пока не будет строки
        if output=='': # когда процесс завершается readline без перерыва возвращает пустую строку
            poll = process.poll()
            if poll is not None:
                work = False
        else:
            #записать output  в файл, отправить по сети т.д.
            pass
    # закрыть файл, сокет
def errTimer(process):
    #примерно тоже самое
    pass
process = subprocess.Popen(args=cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
threading.Timer(1.0, outTimer, args=[process]).start()
threading.Timer(1.0, errTimer, args=[process]).start()

Как еще можно это реализовать?
Может вместо subprocess.PIPE можно подставить свой stream?
Где можно найти примеры?
Заранее спасибо.

Отредактировано larmor (Окт. 27, 2012 21:46:09)

Офлайн

#2 Окт. 27, 2012 23:13:39

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

subprocess.Popen, stdout и stderr

Можно:

stream = open('/dev/null')
subprocess.Popen(
                ['play', wav_file],
                stdout=stream,
                stderr=stream,
                stdin=stream)

Вместо файла можно использовать stringIO

Отредактировано adray (Окт. 27, 2012 23:14:24)

Офлайн

#3 Окт. 28, 2012 11:14:19

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

subprocess.Popen, stdout и stderr

communicate()

process = subprocess.Popen(args=cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = process.communicate()

Офлайн

#4 Окт. 28, 2012 11:56:34

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

subprocess.Popen, stdout и stderr

.communicate() ждет завершения процесса, он не подходит, если результат надо читать сразу или если он большой.

Офлайн

#5 Окт. 30, 2012 02:03:48

larmor
Зарегистрирован: 2012-10-27
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess.Popen, stdout и stderr

Спасибо за советы. .communicate я пробовал. Он действительно возвращал результат только после завершения и не подошел. Попробую детально разобраться со stream

Офлайн

#6 Окт. 30, 2012 03:55:56

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version