Я пытаюсь запустить подпроцесс в потоке, который будет периодически выводить данные (но чаще, чем раз в секунду)
Однако при попытке прочитать стандартный вывод процесса, communicate(timeout=2)
всегда сталкивается сTimeoutError, даже когда должны быть доступны действительные данные stdout.
Код выполняется в приложении фляги, в потоке, порожденном daemon=True
.
Процесс, который я пытаюсь запустить, является
print("A")
time.sleep(1)
print("B")
time.sleep(5)
print("C")
exit()
, который должен давать мне и "A", и "B" без истечения времени ожидания.
ЭтоЦикл, который должен дать мне вывод:
with Popen(
args=[get_python_path(), path.join(
self.path, "output.py")],
stdout=PIPE, stderr=PIPE, universal_newlines=True) as proc:
self.status = RNNTrainer.STARTED
status = None
while status == None:
try:
stdout, stderr = proc.communicate(timeout=2)
print(stdout)
status = proc.returncode
except TimeoutExpired as err:
print("Timeout Expired")
proc.poll()
status == proc.returncode
except Exception as err:
print("Unhandled Ex")
Я хотел бы видеть вывод как:
A
B
Timeout expired <-This after the sleep(5) call
C
Однако вместо этого я получаю
Timeout expired
Timeout expired
Timeout expired
A
B
C
В другихслова..communicate
работает только после завершения программы.В противном случае это просто заканчивается