Можно ли связаться с подпроцессом с подпроцессом. Открыть?
-
05-07-2019 - |
Вопрос
Я пытаюсь написать скрипт на python, который упаковывает наше программное обеспечение. Этот скрипт должен собрать наш продукт и упаковать его. В настоящее время у нас есть другие сценарии, которые выполняют каждый фрагмент отдельно, включая сценарии csh и perl. Один из таких скриптов запускается так:
sudo mod args
где mod - скрипт на Perl; так в Python я бы сделал
proc = Popen(['sudo', 'mod', '-p', '-c', 'noresource', '-u', 'dtt', '-Q'], stderr=PIPE, stdout=PIPE, stdin=PIPE)
Проблема в том, что этот скрипт требует ответа на несколько вопросов. Для этого я подумал, что традиционный
(stdout, stderr) = proc.communicate(input='y')
будет работать. Я не думаю, что это работает, потому что процесс, которым управляет Попен, это sudo, а не скрипт мода, который задает вопрос. Есть ли способ связаться со скриптом мода и все же запустить его через sudo?
Решение
Я бы предпочел пойти с Pexpect. Р>
import pexpect
child = pexpect.spawn ('sudo mod -p -c noresource -u dtt -Q')
child.expect ('First question:')
child.sendline ('Y')
child.expect ('Second question:')
child.sendline ('Yup')
Другие советы
Я думаю, что вы должны удалить sudo
из вашего вызова Popen
и потребовать, чтобы пользователь вашего сценария набрал sudo код>.
Это дополнительно делает более явной необходимость повышения привилегий в вашем сценарии, вместо того, чтобы скрывать его внутри Popen
.
Самое простое, что можно сделать, это запустить управляющий скрипт (скрипт Python) через sudo
. Вы можете сделать это, или это не вариант?
Нам нужна дополнительная информация.
<Ол>Потому что такого рода вещи не обрабатываются как обычно по трубе.
Решением для обоих из них может быть Pexpect , который довольно опытен в работе с забавными скрипты, которые запрашивают пароли, и различные другие проблемы ввода.