Итак, я пытаюсь запустить процесс от имени суперпользователя из скрипта Python, используя подпроцесс. В оболочке ipython что-то вроде
proc = subprocess.Popen('sudo apach2ctl restart',
shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
работает нормально, но как только я втыкаю его в скрипт, я получаю: sudo: apach2ctl: command not found
.
Я предполагаю, что это связано с тем, как sudo обрабатывает среды в Ubuntu. (Я также пробовал sudo -E apche2ctl restart
и sudo env path=$PATH apache2ctl restart
безрезультатно)
Итак, мой вопрос в основном таков: если я хочу запустить apache2ctl restart
как суперпользователя, который при необходимости запрашивает у пользователя пароль суперпользователя, как мне это сделать? Я не собираюсь хранить пароли в скрипте.
Редактировать:
Я пробовал передавать команды как в виде строки, так и в виде списка. В интерпретаторе python со строкой я правильно получу запрос пароля (все еще не работает в сценарии python, как в моей исходной проблеме), список просто дает экран справки для sudo.
Редактировать 2:
Итак, я понимаю, что, хотя Popen будет работать с некоторыми командами так же, как со строками, когда shell=True, требуется
proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
без «shell = True», чтобы заставить sudo работать.
Спасибо!
proc.wait()
в зависимости от того, что вы делаешь;wait
не продолжается до тех пор, пока не завершится выполнение дочернего процесса. - person craymichael   schedule 08.11.2016