在Windows(特别是Win Server 2008 R2)上,我需要重复执行我们的产品重复附带的现有python脚本。偶尔会调用此脚本的意图,并且输入应该是手动的。但是,我最终不得不多次调用此脚本。
所以,我正在尝试使用额外的python脚本自动调用此脚本(以及其他相关脚本)。我挂断的地方是我打电话的“开箱即用”脚本使用getpass.getpass()来输入密码。
在我的自动化脚本中,我尝试使用子进程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()有任何建议?
答案 0 :(得分:1)
好吧,所以我不确定原始剧本的样子。但是,如果仍然需要从命令行使用它,我建议这样做。
我会修改原始脚本以接受参数。例如,假设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”参数传递为false。
编辑:使用子流程模块,您应该能够使用communicate通过
发送密码此外,我找到了pexpect库,可能对您的情况有所帮助
答案 1 :(得分:0)
由于您的代码,这可能是可能的
x = p.stdout.readline().rstrip()
。 stdout.readline()是一个阻塞调用,只要没有输出就会阻塞它。尝试评论该行并查看它是否有效。还要分享" coreScriptCmd"的内容。将有助于更好地找到根本原因。