将Expect脚本转换为Pexpect以允许Enter键



我有一个运行良好的expect脚本,我正试图使用expect或子流程将其转换为python。我使用autoexpect创建了它。

它只需等待密码提示,然后按Enter键忽略它:

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)

我正在使用Python 3

我找到了一个解决方案,它是在预期消息中注释括号的问题。

更改为:

p.expect("Password (hit return if you do not wish to encrypt your wallet):")

完整代码:

import pexpect 
import sys
import os
home_dir = os.path.expanduser('~')
python_exec = home_dir + "/dev/electron-cash-wallet/venv/bin/python"
command = home_dir + "/dev/electron-cash-wallet/src/Electron-Cash/electron-cash"
network = "scalenet"

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)

这里有一个更高级、更详细的功能版本:

import pexpect 
import sys
import os
home_dir = os.path.expanduser('~')
python_exec = home_dir + "/electron-cash-wallet/venv/bin/python"
ec_exec = home_dir + "/electron-cash-wallet/src/Electron-Cash/electron-cash"
network = "scalenet"
def create_wallet(python_exec, ec_exec, network):
print("Python: ", python_exec)
print("Electron Cash: ", ec_exec)
# Execute the command
p = pexpect.spawn(python_exec, [ec_exec, f"--{network}", "create"])
# Verbose, show messages
p.logfile_read = sys.stdout.buffer
p.delaybeforesend = 2
print("Exceution done")
# Expect the response
p.expect("Password (hit return if you do not wish to encrypt your wallet):")
print("Expected input received")
p.delaybeforesend = 1
# Send return key
p.sendline(b'r')
print("Sent response")
p.expect(pexpect.EOF)
print("Script done")
create_wallet(python_exec, ec_exec, network)

最新更新