Почему чтение вывода в реальном времени из подпроцесса Python 3 требует нажатия Enter для вывода данных? - PullRequest
0 голосов
/ 20 ноября 2018

Я перечитывал доступные вопросы, касающиеся обработки подпроцесса в реальном времени в Python 3, хотя ни один из них не решает проблему, с которой я столкнулся.Я работаю над сценарием для анализа соответствующих данных и форматирования вывода исходного сервера специально для Day of Infamy.

Когда скрипт запускается, он запускает сервер Day of Infamy (./doi.sh), который предоставляет переменные запуска сервера, такие как карта, список воспроизведения, данные сервера Battle Eye и т. Д. В определенный момент серверскрипт просто зависает, ожидая события, такого как соединение или уничтожение.В этот момент сервер регистрирует его в STDOUT, однако моя программа на Python перестает выводить какие-либо данные, если вы не нажмете клавишу «Ввод».После нажатия кнопки «Ввод» будут напечатаны данные о самых последних событиях.

Что может быть причиной необходимости нажимать клавишу «Ввод» для получения дополнительной информации?Может ли быть что-то тайм-аут, когда серверный скрипт doi.sh ожидает события?

Мой текущий код для запуска и чтения из подпроцесса:

cmd = './doi.sh' data = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, bufsize=1)</p> <p>while True: output = data.stdout.readline() if output == '' and data.poll() is not None: break if output: output = output.decode('utf-8') print(output)

У меня есть функции, созданные для анализа информации из декодированной строки, они работают со строками, которые выводятся подпроцессом, но необходимость нажать клавишу ввода для обновления журнала консоли отрицательно сказывается на цели всей программы.

1 Ответ

0 голосов
/ 20 ноября 2018

Это почти наверняка проблемы с буферизацией стандартного вывода.Попробуйте заменить команду следующим образом:

stdbuf -o0 ./doi.sh

Это заставит стандартный вывод для doi.sh быть небуферизованным.Вам также необходимо установить ключевое слово arg shell=True в subprocess.Popen()

Вот хорошее объяснение этого: https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

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