我想打电话给你 sleep 10
命令中 pexpect
送线。但是,pexpect并没有等待睡眠结束。
以下是可以用来重现这个问题的示例。
import pexpect
import sys
child = pexpect.spawn('bash', encoding='utf-8')
child.logfile = sys.stdout
child.expect('~')
child.sendline("date");
child.expect('2020')
child.sendline('sleep 10')
child.expect('~',timeout=12)
child.sendline('date')
请注意。
我已经知道使用 time.sleep()
然而,在我的要求中,有一个限制(bash命令和预期的输出是由其他工具发送到python代码),这使得我只能使用bash的sleep。 这个例子只是这个问题的一个缩小版。
修改 ~
到你的bash提示符来重现这个问题。
问题是你的 child.expect('~',timeout=12)
立即返回,因为已经有一个旧的 ~
的缓冲区中,可以匹配。
当你发送 date
你会有这样一行字
Tue Jun 9 15:32:45 GMT 2020
~ $
然后你期望 2020
这就剩下 \r\n~ $
仍在缓冲区中.你应该总是使用一个匹配,直达下一条命令的提示,或者在发送新命令之前刷新缓冲区。虽然有一个 .flush()
方法,它不会这样做。你可以使用,例如
child.read_nonblocking(size=9999, timeout=.1)