将可用Expect脚本转换为Pexpect以支持回车键操作遇阻
问题:Pexpect转换Expect脚本时进程卡顿或无输出
我有一个通过autoexpect生成的可正常运行的Expect脚本,功能是等待密码提示并按回车键跳过钱包加密。但用Python 3的pexpect库转换后出现问题,要么进程卡住无响应,要么直接关闭没有输出。
原Expect脚本
set timeout -1 spawn ./electron-cash --dir "" create match_max 100000 expect -exact "Password (hit return if you do not wish to encrypt your wallet):" send -- "\r" expect eof
存在问题的Pexpect代码
import pexpect import sys python_exec = "/home/user/electron-cash-wallet/venv/bin/python" command = "/home/user/electron-cash-wallet/src/Electron-Cash/electron-cash" p = pexpect.spawn(python_exec, [command, "--scalenet", "create"]) # ~ p.logfile_read = sys.stdout.buffer p.expect("Password (hit return if you do not wish to encrypt your wallet):") p.sendline(b'\r') p.expect(pexpect.EOF)
修复方案
1. 对齐原脚本的精确匹配逻辑
原Expect脚本用expect -exact做精确匹配,普通的p.expect()会按正则表达式匹配,可能因输出中的隐藏字符(如空格、换行)导致匹配失败。改用p.expect_exact()方法,确保完全匹配目标字符串。
2. 修正发送字符的格式与行为
sendline(b'\r')传入字节串无必要,且sendline会自动追加换行符,和原脚本的send -- "\r"行为不一致。直接用p.send('\r')发送回车符,和原脚本逻辑对齐。
3. 开启调试日志排查问题
取消注释p.logfile_read = sys.stdout.buffer,可实时查看进程的所有输出,快速定位是未出现预期提示,还是有其他输出干扰匹配。
4. 设置永不超时
原Expect脚本设置了timeout -1,Pexpect默认超时30秒,若进程输出较慢会触发超时退出。在spawn时添加timeout=None参数,保持和原脚本一致的永不超时逻辑。
修复后的代码示例
import pexpect import sys python_exec = "/home/user/electron-cash-wallet/venv/bin/python" command = "/home/user/electron-cash-wallet/src/Electron-Cash/electron-cash" # 开启日志调试,查看进程所有输出 p = pexpect.spawn(python_exec, [command, "--scalenet", "create"], timeout=None) p.logfile_read = sys.stdout.buffer try: # 精确匹配目标提示字符串 p.expect_exact("Password (hit return if you do not wish to encrypt your wallet):") # 发送回车跳过加密 p.send('\r') # 等待进程结束 p.expect(pexpect.EOF) except pexpect.TIMEOUT: print("等待超时,当前进程输出:", p.before.decode()) except pexpect.EOF: print("进程提前结束,输出内容:", p.before.decode())
内容的提问来源于stack exchange,提问作者uak
相关产品推荐
相关产品推荐

