如何监视pexpect缓冲区的更改

2024-04-19 18:19:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个设备,我正试图控制和制作一个具有许多不同提示的pexpect包装器,其中一些可以很容易地在其他不是提示的输出中找到。然而,这个设备的输出速度非常快,而且在等待的地方,它从来没有任何功能,而不把什么东西放出来。那么,有没有一种方法可以监视pexpect的缓冲区并等待它停止更改,然后返回它而不使用'expect'函数呢?你知道吗


Tags: 方法函数功能地方速度expectpexpect缓冲区
1条回答
网友
1楼 · 发布于 2024-04-19 18:19:44

您可以尝试使用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是一个bashshell脚本,它只是循环等待输入行。写入它的行被分成等待时间time和重复计数repeats。它在等待之后重复行的其余部分,这意味着在少量处理延迟之后模拟输出的突发。你知道吗

您可以对此进行实验,以验证如果输出中的任何暂停时间小于read_nonblocking()超时时间,循环将不会完成,并且不会丢失任何数据。更改size=参数应该没有任何效果,只会导致更多的循环。显然,您应该选择一个合理短的超时时间,但对于反应不快的命令,超时时间不能太短。你知道吗

相关问题 更多 >