You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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模拟终端交互:

  1. 先安装pexpect:
pip install pexpect
  1. 编写代码(注意匹配工具实际的密码提示文本):
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:12:41