Пример №1. Предположим у нас есть родительский процесс parent.py, child.py и файл test.txt. На вход child.py будем отдавать файл, выход будем читать командой
child.stdout.read()
модуль parent.pyfrom subprocess import Popen
import subprocess as sp
with open("test.txt", "r") as file:
child=Popen(['python', 'child.py'], stdin=file, stdout=sp.PIPE)
s=' '
while s:
s=child.stdout.read()
print (s.rstrip().decode(errors='ignore'))
модуль child.pyprint(input(), '- all is good')
time.sleep(1)
print(input(), '- all is good')
time.sleep(1)
print(input(), '- all is good')
time.sleep(1)
Результат, который будет получен через три секунды
hello1 - all is good
hello2 - all is good
hello3 - all is good
Дочерний процесс не выбрасывает кадую строку на вывод. Вывод становится доступным по завершению работы дочернего процесса. Родительский процесс читает вывод командой
child.stdout.read()
.
Пример №2. Если необходимо своевременно отлавливать вывод дочернего процесса, то нужно в него добавить инструкцию
sys.stdout.flush()
, а в родительском заменить
child.stdout.read()
на
child.stdout.readline()
модуль parent.pyfrom subprocess import Popen
import subprocess as sp
with open("test.txt", "r") as file:
child=Popen(['python', 'child.py'], stdin=file, stdout=sp.PIPE)
s=' '
while s:
s=child.stdout.readline()
print (s.rstrip().decode(errors='ignore'))
модуль child.pyprint(input(), '- all is good')
time.sleep(1); sys.stdout.flush()
print(input(), '- all is good')
time.sleep(1); sys.stdout.flush()
print(input(), '- all is good')
time.sleep(1); sys.stdout.flush()
Предвосхищая комментарий: если дочерняя программа не ваша или она вообще не на python, то инструкции
sys.stdout.flush()
может не быть. Поэтому вывод будет доступен только по завершению дочернего процесса. В таком случае замена инструкции
child.stdout.read()
на
child.stdout.readline()
в родительском процессе ничего не даст, цикл в коде позволит вам прочитать построчно весь вывод. Но по времени этот вывод, естественно, будет не синхронизирован с тем, когда эти строки генерировал дочерний процесс