Захват непрерывного вывода внешней программы - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь захватить вывод AtomicParsley, который течет, когда петрушка работает как

Started writing to temp file.
 Progress: >0%-----------------------------------------------------------------------------|
 Progress: =>1%----------------------------------------------------------------------------|
 Progress: ==>2%---------------------------------------------------------------------------|
    ...
 Progress: ======================================================================>95%--|
 Progress: =======================================================================>96%--|
 Progress: ========================================================================>97%--|
 Progress: =========================================================================>98%--|
 Progress: ==========================================================================>99%--|
 Progress: ===========================================================================>100%|
Finished writing to temp file.

но все это распечатывается сразу же после завершения. Код у меня есть:

process = subprocess.Popen([atomicparams], shell=True, stdout=PIPE)
for line in iter(process.stdout.readline, ""):
    print line,

Я прочитал все похожие ответы, но они, кажется, не соответствуют тому, что мне нужно (мне нужны напечатанные строки для подачи индикатора выполнения). Может ли кто-нибудь помочь?

1 Ответ

1 голос
/ 08 мая 2019

Кажется, ваша программа зависает, потому что AtomicParsley никогда не возвращает строку, а вместо этого использует escape-коды, чтобы многократно стирать одну и ту же строку и перепечатывать ее для динамического вывода. Чтобы воспроизвести это в терминале, вы можете напечатать его символ за символом, как только он станет доступен для родительского процесса.

import subprocess
import sys

p = subprocess.Popen([atomicparams], stdout=subprocess.PIPE)
while(True):
    # returns None while subprocess is running
    retcode = p.poll() 
    sys.stdout.buffer.write(p.stdout.read(1))
    sys.stdout.buffer.flush()
    if retcode is not None:
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...