Вывод в реальном времени с использованием подпроцесса скрипта Python с подсказками на чтение ⇐ Python
Вывод в реальном времени с использованием подпроцесса скрипта Python с подсказками на чтение
У меня есть сценарий bash, который взаимодействует с пользователем с помощью приглашений на чтение, например:
#!/bin/bash начало эха read -p "Нажмите что-нибудь, чтобы продолжить" -n 1 -r эхо получило $REPLY. прочитать -p "Нажать еще раз" -n 1 -r эхо "готово" Я хочу запустить сценарий как подпроцесс с использованием Python, одновременно захватывая выходные данные и отображая их пользователю в режиме реального времени. Просматривая различные темы здесь, я нашел это решение, которое действительно работает для меня, однако очень медленно, если сценарий выдает большие выходные данные (значительно дольше, чем запуск сценария вручную). , вероятно, из-за постоянного использования флеша для каждого символа:
подпроцесс импорта с subprocess.Popen(['./a.sh'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) в качестве процедуры: выходной_текст = '' в то время как c := proc.stdout.read(1): print(c, end='', флеш=True) вывод_текст += с Опция «read(1)» необходима, поскольку чтение блокируется, а попытка прочитать более крупные фрагменты означает, что сообщение с подсказкой не будет полностью отображено до того, как пользователь должен будет ввести данные. Сброс также необходим, поскольку без него сообщение с приглашением ввода печатается только после того, как пользователю необходимо ввести данные.
Я ищу решение, которое позволит считывать большие объемы данных (следовательно, уменьшая количество вызовов печати), сохраняя при этом уверенность в том, что полное приглашение отображается пользователю перед ожиданием его ввода.
>
Кроме того, для целей этого вопроса сценарий bash предоставляется в качестве входных данных и не может быть изменен, и у нас нет никакой информации о его структуре. Я пытаюсь написать код, который будет выполнять такие сценарии, одновременно представляя и записывая их выходные данные.
Как и при использовании более крупных фрагментов, readline здесь не будет работать, поскольку ожидает EOL, но EOL получается только после того, как пользователь вводит данные для приглашения.
Я пробовал просмотреть pexpect, но все примеры, которые я видел, предполагают, что они знают, какое приглашение искать, в то время как в этом случае я предполагаю, что не знаю сценария, который запускаю.
В различных подобных вопросах, которые я видел, решение либо использует чтение одного символа (например, путем вызова read(1) или установки размера буфера равным 1), либо использует строку чтения - ни один из которых не кажется подходящим для моего текущего использования случай. Примеры: Как получить выходные данные подпроцесса Python в реальном времени? Получение вывода в реальном времени с использованием подпроцесса Получение полного вывода в реальном времени с использованием подпроцесса
У меня есть сценарий bash, который взаимодействует с пользователем с помощью приглашений на чтение, например:
#!/bin/bash начало эха read -p "Нажмите что-нибудь, чтобы продолжить" -n 1 -r эхо получило $REPLY. прочитать -p "Нажать еще раз" -n 1 -r эхо "готово" Я хочу запустить сценарий как подпроцесс с использованием Python, одновременно захватывая выходные данные и отображая их пользователю в режиме реального времени. Просматривая различные темы здесь, я нашел это решение, которое действительно работает для меня, однако очень медленно, если сценарий выдает большие выходные данные (значительно дольше, чем запуск сценария вручную). , вероятно, из-за постоянного использования флеша для каждого символа:
подпроцесс импорта с subprocess.Popen(['./a.sh'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) в качестве процедуры: выходной_текст = '' в то время как c := proc.stdout.read(1): print(c, end='', флеш=True) вывод_текст += с Опция «read(1)» необходима, поскольку чтение блокируется, а попытка прочитать более крупные фрагменты означает, что сообщение с подсказкой не будет полностью отображено до того, как пользователь должен будет ввести данные. Сброс также необходим, поскольку без него сообщение с приглашением ввода печатается только после того, как пользователю необходимо ввести данные.
Я ищу решение, которое позволит считывать большие объемы данных (следовательно, уменьшая количество вызовов печати), сохраняя при этом уверенность в том, что полное приглашение отображается пользователю перед ожиданием его ввода.
>
Кроме того, для целей этого вопроса сценарий bash предоставляется в качестве входных данных и не может быть изменен, и у нас нет никакой информации о его структуре. Я пытаюсь написать код, который будет выполнять такие сценарии, одновременно представляя и записывая их выходные данные.
Как и при использовании более крупных фрагментов, readline здесь не будет работать, поскольку ожидает EOL, но EOL получается только после того, как пользователь вводит данные для приглашения.
Я пробовал просмотреть pexpect, но все примеры, которые я видел, предполагают, что они знают, какое приглашение искать, в то время как в этом случае я предполагаю, что не знаю сценария, который запускаю.
В различных подобных вопросах, которые я видел, решение либо использует чтение одного символа (например, путем вызова read(1) или установки размера буфера равным 1), либо использует строку чтения - ни один из которых не кажется подходящим для моего текущего использования случай. Примеры: Как получить выходные данные подпроцесса Python в реальном времени? Получение вывода в реальном времени с использованием подпроцесса Получение полного вывода в реальном времени с использованием подпроцесса
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получение вывода в реальном времени из iperf3 с использованием подпроцесса Python
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-