Для меня markitup является превосходным редактором. Это делает обогащенный текст как редактора разметки и позволяет Вам использовать различные стандарты: HTML, Wiki, UBB, и т.д... Это также позволяет плагины очень легко.
Я часто замечал проблемы с чтением стандартного вывода (или даже стандартной ошибки!) С подпроцессом из-за проблем с буферизацией, которые трудно преодолеть. Мое любимое решение, когда мне нужно прочитать такой stdout / stderr из подпроцесса, - это переключиться на использование вместо подпроцесса
, pexpect
(или, в Windows, wexpect
).
FFMPEG:
FFMPEG выводит весь текст состояния (то, что вы видите, когда запускаете его вручную в командной строке) в интерфейсе stderr. Чтобы захватить вывод из ffmpeg, вам нужно следить за интерфейсом stderr - или перенаправлять его, как в примере.
Проверить вывод на stderr:
Вот еще один способ попробовать и прочитать из stderr вместо перенаправления это при вызове Popen
Класс Popen в Python имеет файловый объект с именем stderr, вы получите доступ к нему так же, как и к stdout. Я думаю, ваш цикл будет выглядеть примерно так:
while 1:
print convert.ffmpeg.stdout.readline()
print convert.ffmpeg.stderr.readline()
Заявление об ограничении ответственности: я не тестировал это на Python, но я сделал аналогичное приложение на Java.
Я думаю, вы не можете использовать readline, потому что ffmpeg никогда не печатает одну строку, статус обновляется записью \ r (возврат каретки), а затем записью строки очередной раз.
size= 68kB time=0.39 bitrate=1412.1kbits/s \rsize= 2786kB time=16.17 bitrate=1411.2kbits/s \rsize= 5472kB time=31.76 bitrate=1411.2kbits/s \r\n
Если вы посмотрите на строку выше, вы заметите, что там только один \ n, который печатается, когда файл будет преобразован.
Поскольку ffmpeg записывает данные без сброса в stderr, вы должны установить для дескриптора файла stderr неблокирующий режим с помощью fcntl.
fcntl.fcntl( pipe.stderr.fileno(), fcntl.F_SETFL, fcntl.fcntl(pipe.stderr.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK, )
, а затем в цикле, используя select для чтения данных
while True: readx = select.select([pipe.stderr.fileno()], [], [])[0] if readx: chunk = pipe.stderr.read()
, для полного примера перейдите сюда .