【问题标题】:How to monitor pexpect buffer for changes如何监视 pexpect 缓冲区的更改
【发布时间】:2019-07-17 15:55:12
【问题描述】:

我有一个设备,我正在尝试控制并制作一个带有许多不同提示的 pexpect 包装器,其中一些可以很容易地在其他不是提示的输出中找到。然而;该设备的输出速度非常快,并且在没有放出 something 的情况下永远不会有任何等待的功能。那么有没有办法监视缓冲区的 pexpect 并等到它停止更改,然后在不使用 'expect' 函数的情况下返回它?

【问题讨论】:

    标签: python pexpect


    【解决方案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= 参数应该没有任何效果,除了会导致更多循环。显然,您应该选择一个相当短的超时,但对于反应不快的命令来说也不能太短。

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 2018-12-20
      • 2018-06-07
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多