我试图在Python脚本中使用subprocess运行超级用户进程。在IPython shell中可以这样做:
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
会等待子进程运行完毕后再继续执行。 - craymichaelsudo: apach2ctl: command not found
是因为你在服务名apache2ctl
中打错了一个字母。 - Josh Correia