【发布时间】:2020-09-10 08:30:49
【问题描述】:
我对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() (与期望不同)。是这样吗?
-
@pynexj 你能检查我更新的问题吗?
-
必须与 py3 相关。你的 python 和 pexpect 的版本是什么?
-
对于py3,试试
child.logfile_read = sys.stdout.buffer