![Определите, когда скрипт Python ожидает ручного ввода](https://rvso.com/image/38672/%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%20Python%20%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%B5%D1%82%20%D1%80%D1%83%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0.png)
Я пишу скрипт оболочки, который выполняет скрипт 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.