Форум сайта python.su
0
Требуется обработать 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()
Отредактировано larmor (Окт. 27, 2012 21:46:09)
Офлайн
18
Можно:
stream = open('/dev/null') subprocess.Popen( ['play', wav_file], stdout=stream, stderr=stream, stdin=stream)
Отредактировано adray (Окт. 27, 2012 23:14:24)
Офлайн
173
process = subprocess.Popen(args=cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, err = process.communicate()
Офлайн
14
.communicate() ждет завершения процесса, он не подходит, если результат надо читать сразу или если он большой.
Офлайн
0
Спасибо за советы. .communicate я пробовал. Он действительно возвращал результат только после завершения и не подошел. Попробую детально разобраться со stream
Офлайн
14
Офлайн