Подтвердить что ты не робот

Как получить нормальное выполнение инструкции печати при использовании stdout = subprocess.PIPE во время вызова подпроцесса в python

Я запускаю subprocess в python с помощью этой команды:

result = subprocess.Popen([sys.executable, "/subscript.py"] + parameter,stdout=subprocess.PIPE )
result.wait()
out, err = result.communicate()
for line in out.splitlines():
    print line

Проблема, с которой я столкнулся в этом подходе, состоит в том, что все операторы print в subscript.py буферизуются до конца и печатаются на terminal в конце выполнения. Поэтому, если мой subscript.py занимает около 15 минут, тогда в течение 15 минут terminal ничего не показывает, и как только выполнение subscript.py заканчивается, все операторы печати печатаются вместе. Я знаю, что это из-за использования stdout=subprocess.PIPE, и если я удалю его, то я получу то, что хочу, но я не могу его удалить, поскольку я использую его для получения значения переменной из subscript.py (я печатаю эту переменную в subscript.py, а затем в родительском script я просматриваю каждую печать, чтобы получить печать с переменным значением).

Итак, я хочу, чтобы все инструкции печати были напечатаны, поскольку они встречаются в subscript.py без какой-либо буферизации до конца выполнения. Есть ли способ сделать это?

UPDATE: Я попытался выполнить J.F. Себастьян, но я все равно получаю тот же результат. Отпечатки из подпроцесса буферизуются, и как только субпроцесс заканчивается, они печатаются на терминал. Обновленный код у меня:

result = subprocess.Popen([sys.executable, "/subscript.py"] + parameter,stdout=subprocess.PIPE,bufsize=1)

with result.stdout:
        for line in iter(result.stdout.readline, b''):
            print line,
result.wait()
4b9b3361

Ответ 1

Ответ, который вы связали, печатает что-либо только после сброса буфера stdout в дочернем элементе, поскольку он явно указан в самом ответе.

Используйте -u параметр, чтобы отключить stdout в дочернем процессе Python:

#!/usr/bin/env python2
import sys
from subprocess import Popen, PIPE

result = Popen([sys.executable, '-u', '/path/to/subscript.py'] + parameters, 
               stdout=PIPE, bufsize=1)
with result.stdout:
    for line in iter(result.stdout.readline, b''):
        print line,
result.wait()