pexpect 有时会命中,有时会失败并在超时时退出
pexpect sometimes hit, sometimes fails and exit on timeout
我正在编写一个小型自动化程序以通过 ssh 连接到远程服务器、激活 PERL 脚本并与脚本交互(生成菜单供用户选择)。
我有一个用户预定义的响应列表,我已经浏览了 PERL 脚本并记下了菜单提示以便在 "pexpect" 中使用它。
现在,我有:
global MYTIMEOUT
print "starting building"
child.sendline('/root/myscripts/perl/_build_.pl')
child.expect('username',timeout=MYTIMEOUT)
child.sendline(value_dict['myname'])
child.expect('reason',timeout=MYTIMEOUT)
child.sendline(value_dict['myreason'])
child.expect(value_dict["branch"],timeout=MYTIMEOUT)
child.sendline(branch_number)
child.expect('enter revision',timeout=MYTIMEOUT)
child.sendline('\n')
child.expect('choose customers',timeout=MYTIMEOUT)
child.sendline(value_dict['customers'])
child.expect('choose number',timeout=MYTIMEOUT)
child.sendline(value_dict['component_list'])
所以 username,reason,branch and revision
的 expect 一切正常,当我打开 child 的日志文件时,我可以清楚地看到它们响应了正确的行。
在此之后,PERL 脚本执行了一些代码,大约 5-6 秒,其中他输出 shell 人 运行 的信息,之后,我得到 'choose customers' and 'choose number'
sendline 忽略我写的内容,并为客户发送一个 [return] 值,当它期望选择号码时,它不会发送任何内容,最终超时。
有什么办法可以强制sendline服从我吗?或者确保 expect 捕捉到它应该捕捉到的模式?
编辑:添加信息
问题是 child.sendline('\n')
,程序预期并按下了回车键,但仔细查看日志,我看到在自动化日志中,我有两个换行符,而在正常输出中,我有一个换行符。
在那之后剩下的流程就搞砸了,这就是为什么我得到奇怪的东西和换行符。
将其更改为 child.sendline('')
解决了。
感谢所有尝试过的人。
我正在编写一个小型自动化程序以通过 ssh 连接到远程服务器、激活 PERL 脚本并与脚本交互(生成菜单供用户选择)。 我有一个用户预定义的响应列表,我已经浏览了 PERL 脚本并记下了菜单提示以便在 "pexpect" 中使用它。 现在,我有:
global MYTIMEOUT
print "starting building"
child.sendline('/root/myscripts/perl/_build_.pl')
child.expect('username',timeout=MYTIMEOUT)
child.sendline(value_dict['myname'])
child.expect('reason',timeout=MYTIMEOUT)
child.sendline(value_dict['myreason'])
child.expect(value_dict["branch"],timeout=MYTIMEOUT)
child.sendline(branch_number)
child.expect('enter revision',timeout=MYTIMEOUT)
child.sendline('\n')
child.expect('choose customers',timeout=MYTIMEOUT)
child.sendline(value_dict['customers'])
child.expect('choose number',timeout=MYTIMEOUT)
child.sendline(value_dict['component_list'])
所以 username,reason,branch and revision
的 expect 一切正常,当我打开 child 的日志文件时,我可以清楚地看到它们响应了正确的行。
在此之后,PERL 脚本执行了一些代码,大约 5-6 秒,其中他输出 shell 人 运行 的信息,之后,我得到 'choose customers' and 'choose number'
sendline 忽略我写的内容,并为客户发送一个 [return] 值,当它期望选择号码时,它不会发送任何内容,最终超时。
有什么办法可以强制sendline服从我吗?或者确保 expect 捕捉到它应该捕捉到的模式?
编辑:添加信息
问题是 child.sendline('\n')
,程序预期并按下了回车键,但仔细查看日志,我看到在自动化日志中,我有两个换行符,而在正常输出中,我有一个换行符。
在那之后剩下的流程就搞砸了,这就是为什么我得到奇怪的东西和换行符。
将其更改为 child.sendline('')
解决了。
感谢所有尝试过的人。