Определите, когда скрипт Python ожидает ручного ввода

Определите, когда скрипт Python ожидает ручного ввода

Я пишу скрипт оболочки, который выполняет скрипт Python. Скрипт Python останавливается для ручного ввода. Однако я не хочу нажимать Enter каждый раз в скрипте. Вместо этого я хочу передать ручной ввод из выполняемого скрипта оболочки.

Помогите, пожалуйста, если есть способ это сделать?

решение1

Если требуется только один ввод, просто используйте echoи вертикальную черту:

echo | python script.py

echoвыводит пустую строку (с новой строкой) на стандартный вывод, а затем перенаправляет ее на вход скрипта Pythonс использованием|. Когда Python считывает данные со стандартного ввода, он получает пустую строку и продолжает работу.

Если скрипт требует более одного нажатия Enter, вы можете использоватьyesкомандаи труба:

yes "" | python script.py

Команда yesвыводит одну и ту же строку на стандартный вывод снова и снова. По умолчанию строка — y, но здесь мы делаем ее пустой, так что это просто новые строки навсегда.


Если ввод требуется в ответ на конкретную подсказку, а в других случаях вам нужен другой ввод, используйтеexpect, который представляет собой «расширение Tcl, позволяющее автоматизировать взаимодействие с интерактивными программами».

Можно написать свой скрипт оболочки так, чтобы он считывал вывод Python и создавал для него новый ввод, но я не особенно рекомендую это делать. Если вы хотите это сделать, см.Перенаправление ввода-вывода в расширенном руководстве по написанию сценариев Bash: для этого вам нужно будет клонировать дескрипторы файлов. Вы также можете использоватьmkfifoи создайте файлы именованных каналов, а затем читайте и записывайте в них обычным образом.

Честно говоря, я бы начал думать об альтернативных подходах, если вы достигли точки, когда следует использовать любой из этих подходов: скрипты оболочки просто не созданы для этого, и будет гораздо проще написать свой скрипт, скажем, на самом Python.

Связанный контент