Как получить нормальное выполнение инструкции печати при использовании 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()
Ответы
Ответ 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()