@ANDRE888

Как писать содержимое stdout в переменную, не дожидаясь когда будет выведен символ новой строки?

Задача: В python запустить процесс, читать его вывод и писать его в переменную. Покажу на примере ffmpeg.
С этим справляется следующий код

import subprocess

def func(cmd):
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while True:
        line = p.stdout.readline()
        print (line)
    
func("ffmpeg -i rtsp://admin:admin@192.168.1.2:554//h264Preview_01_main -vn -filter:a silencedetect=n=-30dB:d=1 -f null -")


Вывод читается отлично, ровно до момента пока ffmpeg заканчивает свои сообщения символом новой строки \n.
В какой то момент ffmpeg начинает просто перезаписывать последнюю строку при помощи \r и я не получаю никаких данных до момента пока он не скинет сообщение с символом новой строки.
Очевидно что проблема в readline().
Вопрос: Как писать содержимое stdout в переменную, не дожидаясь когда будет выведен символ новой строки?
Пытался мудрить с flush(), read(), communicate(), check_output(). Но у меня это все заканчивается либо зависанием программы, либо вывод не пишется в переменную.
  • Вопрос задан
  • 544 просмотра
Решения вопроса 1
@rPman
Потому что читаешь с помощью .readline() которая по определению ждет символ '\n'
Хочешь другой символ, используй просто read и сам сканируй буфер на наличие \r и собирай строку

как вариант, подмени вывод чем-нибудь, используя пайпы, например tr, а чтобы он не буферизировал вывод, добавь stdbuf -o0, обсуждалось тут
ffmpeg -i input.mov output.webm 2>&1 | stdbuf -o0 tr '\r' '\n'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы