在Windows(特别是Win Server 2008 R2)上,我需要重复执行我们产品随附的现有python脚本。该脚本的意图是偶尔被调用,并且输入应该是手动的。但是,我最终不得不多次调用此脚本。

因此,我正在尝试使用其他python脚本自动执行对此脚本(以及其他相关脚本)的调用。我挂断电话的地方是我正在调用的“开箱即用”脚本使用getpass.getpass()进行密码输入。

在自动化脚本中,我尝试使用subrocess pipe.communicate将密码值传递给基本脚本。但是我无法正常工作。这是自动化脚本中的相关代码:

p = Popen(coreScriptCmd, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
x = p.stdout.readline().rstrip()
print x     #for debugging
x = p.communicate(args.pwd1+"\n"+args.pwd2)[0].rstrip()
print x     #for debugging


正如我所说,当被调用的子进程正在使用getpass.getpass()来请求输入时,这是行不通的。这是我遇到麻烦的核心代码中的if语句:

elif cmd == 'update-user':
if 'password1' not in globals():
    password1 = getpass.getpass(mgmtusername + " password:")
if 'dbpassword' not in globals():
    dbpassword = getpass.getpass(dbusername + " password:")
checkAccessDb(hostname, database, mgmtusername, password1, dbusername, dbpassword)


是否有人对如何以编程方式将值传递给下标中的getpass()有任何建议?

最佳答案

好吧,所以我不确定原始脚本是什么样子。但是,在仍然需要从命令行使用它的情况下,我建议您这样做。

我将修改原始脚本以接受一个参数。例如,假设getpass在这样的函数内...

def run_script():
    paswd = getpass.getpass("Please enter the password:")


尝试将其修改为如下所示:

def run_script(cmdlin = True):
    if cmdlin:
        paswd = getpass.getpass("Please enter the password:")
    else:
        # get password using another method


另一种方法可以是您选择的任何方法,将其作为参数传递,从文件中获取等等。

像这样设置后,只需将其传递为“ cmdlin”参数即可。

编辑:使用子流程模块,您应该能够使用communicate通过

此外,我发现了pexpect库可能对您的情况有所帮助

关于python - Python 2.7:将值传递给getpass,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35612744/

10-12 23:23