我有一个要控制的设备,并使用许多不同的提示为其制作pexpect包装器,其中一些可以轻松地在不是提示的其他输出中找到。然而;该设备具有很高的输出速度,并且在没有放置 something 的情况下从未具有任何等待功能。那么,有没有一种方法可以监视缓冲区的pexpect并等待其停止变化,然后不使用“ expect”功能就将其返回?
答案 0 :(得分:1)
您可以尝试使用pexpect方法read_nonblocking(size=,timeout=)
,该方法立即返回任何数据,如果在给定的时间内未找到第一个字节,则引发超时异常。通过在一个循环中重复执行直到超时,并累积数据,您将在设备处于安静状态时检测到输出结束。考虑代码:
#!/usr/bin/python3
import pexpect
class Myspawn(pexpect.spawn):
def readall(self):
data = b""
while 1:
try:
data += self.read_nonblocking(size=999,timeout=1)
except pexpect.exceptions.TIMEOUT:
return data.decode('iso-8859-1')
cmd = '''while read time repeats rest
do sleep $time; for i in $(seq $repeats);do echo $i $rest; done
done'''
child = Myspawn('bash',['-c',cmd])
child.sendline(".1 1 test line")
print(child.readall())
child.sendline(".9 10 test line")
print(child.readall())
readall()
方法循环无限次地累积读取(字节而不是字符串),并且最终没有更多数据时,超时异常导致它返回数据。
为了进行测试,正在运行的命令cmd
是一个bash shell脚本,仅循环等待输入行。您写入其中的行分为等待时间time
和重复计数repeats
。等待后,它会重复执行该行的其余部分,这是为了模拟经过少量处理延迟后的突发输出。
您可以对此进行试验,以验证输出中的任何暂停所花费的时间少于read_nonblocking()
超时,循环将不会结束,并且您不会丢失任何数据。更改size=
参数不会引起任何影响,除了会引起更多的循环。显然,您应该选择一个相当短的超时时间,但是对于不能快速响应的命令来说,该时间不要太短。