在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/