我熟悉expect脚本,所以当我第一次使用pexpect时感觉有点奇怪。以这个简单的脚本为例
#!/usr/bin/expect
set timeout 10
spawn npm login
expect "Username:"
send "qiulang2000\r"
expect "Password:"
send "xxxxx\r"
expect "Email:"
send "qiulang@gmail.com\r"
expect "Logged in as"
interact
当运行它时,我将得到以下输出。这感觉很自然,因为我就是这样运行这些命令的
spawn npm login
Username: qiulang2000
Password:
Email: (this IS public) qiulang@gmail.com
Logged in as qiulang2000 on https://registry.npmjs.com/.
但是,当我使用pexpect时,无论我如何添加print(child.after)
或print(child.before)
,我都无法获得预期的输出,例如,当我运行以下命令时
#! /usr/bin/env python3
import pexpect
child = pexpect.spawn('npm login')
child.timeout = 10
child.expect('Username:')
print(child.after.decode("utf-8"))
child.sendline('qiulang2000')
child.expect('Password:')
child.sendline('xxxx')
child.expect('Email:')
child.sendline('qiulang@gmail.com')
child.expect('Logged in as')
print(child.before.decode("utf-8"))
child.interact()
我得到了这些输出,感觉很不自然,因为这不是我运行这些命令时看到的
Username:
(this IS public) qiulang@gmail.com
qiulang2000 on https://registry.npmjs.com/.
那么,是否有可能实现预期的脚本输出
---更新--
有了@pynexj的评论,我终于成功了,请查看下面的答案
有了我得到的评论,我终于成功了
如果我需要调用child.interact(),那么在它前面调用
child.logfile_read = None
是很重要的,否则sys.stdout将回显我键入的所有内容这里的答案How to see the output in pexpect?说我需要传递python3的编码,但是我发现如果我使用
encoding='utf-8'
,它将导致TypeError: a bytes-like object is required, not 'str'
如果我根本不设置编码,一切都可以正常工作简单的ssh登录脚本如下所示
还有一个问题没有解决,我在发送密码后添加了最后一个expect调用以匹配ssh登录输出,例如child.expect('last login')
但如果我加上这句话,那条线会显示两次。我已经放弃了尝试,就像一条评论说的“pexpect的行为有点违反直觉”
相关问题 更多 >
编程相关推荐