exécuter une commande en tant que super-utilisateur à partir d'un script python

Donc je vais essayer d'obtenir un processus pour s'exécuter en tant que super-utilisateur depuis un script python à l'aide de sous-processus. Dans le ipython shell quelque chose comme

proc = subprocess.Popen('sudo apach2ctl restart',
                        shell=True, stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)

fonctionne très bien, mais dès que j'ai le coller dans un script que j'ai commencer à obtenir: sudo: apach2ctl: command not found.

Je suppose que cela est dû à la façon sudo poignées environnements sur ubuntu. (J'ai aussi essayé de sudo -E apche2ctl restart et sudo env path=$PATH apache2ctl restart avec en vain)

Donc ma question est, fondamentalement, si je veux courir apache2ctl restart en tant que super utilisateur qui invite l'utilisateur à entrer le mot de passe super utilisateur lorsque requis, comment dois-je faire? Je n'ai pas l'intention de stocker les mots de passe dans le script.

Edit:

J'ai essayé en passant les commandes à la fois comme une chaîne de caractères et sous dans une liste. Dans l'interpréteur python, avec une chaîne, je vais obtenir l'invite de mot de passe correctement (ne marche pas encore dans un script python que dans mon problème d'origine), une liste donne juste l'écran d'aide pour sudo.

Edit 2:

Donc, ce que je comprends, c'est que tout Popen qui travaillent avec des commandes comme des chaînes lorsque le shell=True, il faut

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])

sans "shell=True' pour obtenir sudo pour travailler.

Merci!

  • Comment à propos de la configuration de sudo, de sorte que l'utilisateur peut exécuter simplement cette commande sans exiger un mot de passe?
  • Vous pouvez utiliser proc.wait() en fonction de ce que vous faites; wait ne pas continuer jusqu'à ce que le processus de l'enfant a fini de s'exécuter.