1

У меня есть сценарий Python, который ожидает пользовательского ввода, как это:

сценарий изображения

Вместо того, чтобы выполнять программу и вводить "Джон", я хочу передать ей ввод из командной строки, например, $ python script.py < "John" но это не работает. Есть ли способ добиться того, чего я хочу?

3 ответа3

1

Действительно простой способ добиться этого - использовать sys.argv из модуля sys , который позволяет вам получать доступ к аргументам командной строки. sys.argv - это список аргументов командной строки, а sys.argv[0] - это имя скрипта.

Вы можете принять аргумент командной строки, если он есть, в противном случае запросить ввод у пользователя:

#!/usr/bin/python3
import sys

if len(sys.argv) > 1:
    name = sys.argv[1]
else:
    name = input("Enter name:")

print(name)

Затем вы вызываете скрипт с аргументом командной строки, если это необходимо: ./script.py John .

1

Если скрипт использует свой stdin для чтения данных, вы использовали эту строку

python script.py < "John"

должен сработать, за исключением того, что он пытается отправить содержимое файла с именем John на стандартный сценарий сценария (и не получится, если такого файла нет; я полагаю, это случилось с вами). В Bash есть способ отправить строку, хотя здесь:

python script.py <<< "John"

Новая строка добавляется автоматически. Другой способ с конвейером:

printf '%s\n' "John" | python script.py

и это должно работать даже в простой sh . Так должно это:

echo "John" | python script.py

Обратите внимание, что printf в целом лучше, чем echo, но с этой фиксированной строкой обе команды должны работать правильно.


Ничто из вышеперечисленного не будет работать, если сценарий напрямую использует свой управляющий терминал (/dev/tty) вместо своего стандартного ввода для чтения ответа пользователя. Если так, expect (как в этом другом ответе) будет полезно. Вы не показали нам сам сценарий, поэтому невозможно сказать наверняка; ты должен знать.

0

Простой способ - создать скрипт для ввода информации:

#!/usr/bin/expect
set cmd [lrange $argv 1 end]
set val [lindex $argv 0]

eval spawn $cmd
expect ":"
send "$val\r";
interact

Сохраните этот файл где-нибудь (например, ~/sendInput.sh) и запустите sudo chmod +x ~/sendInput.sh чтобы сделать файл исполняемым

сейчас беги !/sendInput.sh "Jhon" python script.py Это должно отправить входной файл "Jhon" в script.py после отправки символа ":".

(Взято из https://srvfail.com/how-to-provide-ssh-password-inside-a-script-or-oneliner/)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .