如何监视pexpect缓冲区的更改

时间:2019-07-17 15:55:12

标签: python pexpect

我有一个要控制的设备,并使用许多不同的提示为其制作pexpect包装器,其中一些可以轻松地在不是提示的其他输出中找到。然而;该设备具有很高的输出速度,并且在没有放置 something 的情况下从未具有任何等待功能。那么,有没有一种方法可以监视缓冲区的pexpect并等待其停止变化,然后不使用“ expect”功能就将其返回?

1 个答案:

答案 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=参数不会引起任何影响,除了会引起更多的循环。显然,您应该选择一个相当短的超时时间,但是对于不能快速响应的命令来说,该时间不要太短。