使用 subprocess.call 时如何输入 sudo 密码?

how to type sudo password when using subprocess.call?

我定义了一个不时切换我的代理设置的函数, 问题是我希望它在没有人工干预的情况下循环 运行 。但是当我在 sudo 中执行程序时,它第一次被调用 en 运行s 顺利,第二次它询问我的 sudo 密码。这是代码的一部分:

def ProxySetting(Proxy):
    print "ProxyStetting(Proxy)"
    call("networksetup -setwebproxy 'Wi-Fi' %s" "on" % Proxy, shell = True)
    call("networksetup -setsecurewebproxy 'Wi-Fi' %s" "on" % Proxy, shell = True)
    call("networksetup -setftpproxy 'Wi-Fi' %s" "on" %Proxy , shell=True)

我可以使用线程,但我确信有一种方法不会导致问题。我如何硬编码我的 sudo 密码,以便它 运行s 在函数的开头?

在这里您可以执行命令 sudo 而无需交互式提示要求您输入密码:

from subprocess import call    

pwd='my password'
cmd='ls'

call('echo {} | sudo -S {}'.format(pwd, cmd), shell=True)

通过 python 将密码传递给 shell 命令的另一种方法是:

p = subprocess.Popen(['sudo', self.resubscribe_script], stdin=subprocess.PIPE)
p.communicate('{}\n'.format(self.sudo_password))

请注意,使用 communicate 将只允许将一个输入提供给标准输入;还有其他获取可重用输入的方法。