处理Python中的提示 - popen

时间:2017-02-07 20:26:22

标签: python subprocess popen

这是我的示例python代码

def gitClone():
    proc = subprocess.Popen(['git', 'clone', 'https://someuser@sailclientqa.scm.azurewebsites.net:443/sailclientqa.git'], stdout=subprocess.PIPE)
    stdout,stderr = proc.communicate('mypassword')
    print(stddata)
    print (stderr) 

每次执行都会导致提示输入密码。在没有密码提示的情况下,从python执行git clone的最佳方法是什么。

我很感激您的专业知识/建议

1 个答案:

答案 0 :(得分:1)

天真的方法是将stdin=subprocess.PIPE添加到您的命令中,以便您可以输入密码输入。但是,使用密码输入并不是那么简单,它使用特殊方式获取键盘输入。

另一方面,如this answer中所述,可以在命令行中传递密码(尽管不建议,因为密码存储在命令行的git命令历史记录中!)。

我会修改你的代码如下:

  • 添加password参数。如果没有设置,使用python getpass模块提示输入密码(也许你不需要)
  • 如果密码设置正确,请在修改后的命令行中传递

我的建议:

import getpass

def gitClone(password=None):
    if password is None:
        password = getpass.getpass()
    proc = subprocess.Popen(['git', 'clone', 'https://someuser:{}@sailclientqa.scm.azurewebsites.net:443/sailclientqa.git'.format(password)], stdout=subprocess.PIPE)
    stdout,stderr = proc.communicate()
    print(stddata)
    print (stderr)

如果上述解决方案无效并且无法设置ssh密钥,则可以使用pexpect模块来处理特殊密码输入流:

def gitClone(mypassword):
    child = pexpect.spawn('git clone https://someuser@sailclientqa.scm.azurewebsites.net:443/sailclientqa.gi')
    child.expect ('Password:')
    child.sendline (mypassword)

它具有在git命令历史记录中存储密码的优点。

来源:How to redirect data to a "getpass" like password input?