Считайте вход потоковой передачи из subprocess.communicate ()

Я использую Python subprocess.communicate() считать stdout из процесса, который работает приблизительно в течение минуты.

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

subprocess.communicate() кажется, дает весь вывод сразу.

75
задан martineau 7 January 2019 в 20:58
поделиться

2 ответа

Обратите внимание, я думаю J.F. Метод Себастьяна (ниже) лучше.


Вот простой пример (без проверки на наличие ошибок):

import subprocess
proc = subprocess.Popen('ls',
                       shell=True,
                       stdout=subprocess.PIPE,
                       )
while proc.poll() is None:
    output = proc.stdout.readline()
    print output,

Если ls завершается слишком быстро, то цикл while может завершиться до того, как вы прочитаете все данные.

Вы можете получить остаток в stdout следующим образом:

output = proc.communicate()[0]
print output,
41
ответ дан 24 November 2019 в 11:30
поделиться

Если вам нужен неблокирующий подход, не используйте process.communicate () . Если вы установите subprocess.Popen () аргумент stdout на PIPE , вы можете прочитать из process.stdout и проверить, все еще работает с использованием process.poll () .

3
ответ дан 24 November 2019 в 11:30
поделиться
Другие вопросы по тегам:

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