Звоните p.stdout.readline()
вместо p.stdout.read()
.Это даст вам по одной строке за раз, вместо того, чтобы ждать, пока процесс закроет свою трубу стандартного вывода.Для получения дополнительной информации прочитайте документацию .
Вот более подробный пример.Представьте, что этот скрипт заменяет ваш exe-файл:
# scratch.py
from time import sleep
for i in range(10):
print('This is line', i)
sleep(1)
Теперь я запускаю этот скрипт и пытаюсь прочитать его вывод:
from subprocess import Popen, PIPE, STDOUT
p = Popen(['python', 'scratch.py'], stdin=PIPE, stdout=PIPE, stderr=STDOUT, encoding='UTF8')
for i in range(10):
response = p.stdout.read()
print('Response', i)
print(response)
Результаты выглядят так: он ждетдесять секунд, затем распечатывает следующее:
Response 0
This is line 0
This is line 1
This is line 2
This is line 3
This is line 4
This is line 5
This is line 6
This is line 7
This is line 8
This is line 9
Response 1
Response 2
Response 3
Response 4
Response 5
Response 6
Response 7
Response 8
Response 9
Теперь, если я изменю его на readline()
, я получу это:
Response 0
This is line 0
Response 1
This is line 1
Response 2
This is line 2
Response 3
This is line 3
Response 4
This is line 4
Response 5
This is line 5
Response 6
This is line 6
Response 7
This is line 7
Response 8
This is line 8
Response 9
This is line 9