使用Python subprocess自动化pepk.jar双密码输入失败求助
解决Python调用pepk.jar两次输入密码失败的问题
原方法的问题分析
- 方法1错误:
subprocess.Popen.communicate()只能调用一次,第一次调用后会关闭标准输入流,第二次调用无法再向进程写入数据。 - 方法2错误:先调用
stdin.write()再调用communicate(),communicate()会覆盖之前的输入操作并关闭流,导致Java程序无法正确读取两次密码输入。
正确解决方案
方案1:通过一次communicate()传入两次密码
如果pepk.jar通过标准输入流读取密码,直接将两次密码用换行符拼接后一次性传入即可:
import subprocess password = "你的密钥库密码" command = ['java', '-jar', 'pepk.jar', 'arg1', 'arg2', 'etc'] proc = subprocess.Popen( command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 两次密码用换行分隔,最后再加一个换行模拟手动回车 stdout, stderr = proc.communicate(input=f"{password}\n{password}\n") print("标准输出:") print(stdout) print("错误输出:") print(stderr)
方案2:使用pexpect模拟终端交互(针对控制台专属输入)
如果pepk.jar通过System.console().readPassword()这类控制台专属方法读取密码,subprocess的管道无法捕获输入请求,需要用pexpect模拟终端交互:
- 先安装pexpect:
pip install pexpect
- 编写代码(注意匹配工具实际的密码提示文本):
import pexpect password = "你的密钥库密码" command = 'java -jar pepk.jar arg1 arg2 etc' proc = pexpect.spawn(command) # 匹配第一次密码提示,比如工具输出的"Enter keystore password:" proc.expect("Enter keystore password:") proc.sendline(password) # 匹配第二次密码提示,根据工具实际输出调整 proc.expect("Enter keystore password again:") proc.sendline(password) proc.expect(pexpect.EOF) stdout = proc.before.decode('utf-8') stderr = proc.stderr.read().decode('utf-8') print("标准输出:") print(stdout) print("错误输出:") print(stderr)
内容的提问来源于stack exchange,提问作者user10895732
相关产品推荐
相关产品推荐

