subprocess.communicate читает только при выходе - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь запустить подпроцесс в потоке, который будет периодически выводить данные (но чаще, чем раз в секунду)

Однако при попытке прочитать стандартный вывод процесса, 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 работает только после завершения программы.В противном случае это просто заканчивается

1 Ответ

1 голос
/ 02 апреля 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...