Вы можете придерживаться лучших практик и использовать принятый метод для взаимодействия с подпроцессами.
import subprocess
out = subprocess.run('sudo -S ls', shell=True, input=b'123', stdout=subprocess.PIPE)
print(out.stdout)
Подробно об этом методе операций можно прочитать в документах , но в нескольких словах об этом:
Гораздо проще программировать, потому что у вас есть обычные инструменты кодирования, которые вы ожидаете. Такие как исключения и возвращаемые значения.
В приведенном выше примере мы используем рекомендованный -S
, который указывает sudo
использовать обычный канал связи stdin
для приема данных ввода. Каждый процесс имеет 3 канала связи: stdin
, stdout
и stderr
. Их имена подразумевают их намерение. stdin
для ввода, stdout
для нормального вывода (без ошибок), stderr
для вывода, означающего ошибки. Чувствительный ввод не использует обычный stdin
, который sudo
предлагал в вашем сообщении об ошибке.
Мы просим subprocess.run
использовать новый stdout
канал с синтаксисом subprocess.PIPE
. В противном случае он наследует те же каналы связи от своего родителя (сценарий Python), а выходные данные команды sudo -S ls
будут немедленно выгружены в выходные данные сценария Python. Что, как правило, нежелательно.
Наконец, мы печатаем результаты.