如何监视预期缓冲区的变化
How to monitor pexpect buffer for changes
我有一个设备,我正在尝试控制它并为它制作一个带有许多不同提示的预期包装器,其中一些可以很容易地在不是提示的其他输出中找到。然而;该设备的输出速度非常快,并且在等待 something 之前从来没有任何功能。那么有没有一种方法可以监视缓冲区的预期并等到它停止更改,然后 return 不使用 'expect' 函数?
您可以尝试使用 pexpect 方法 read_nonblocking(size=,timeout=)
,该方法 return 立即处理任何数据,或者如果在给定时间内未找到第一个字节,则引发超时异常。通过在循环中重复它直到超时,并累积数据,当设备安静时,您将检测到输出结束。考虑代码:
#!/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()
方法循环无限累积读取(是字节,不是字符串),当最后没有更多数据时,超时异常导致它return数据。
为了测试,命令 运行、cmd
是一个 bash shell 脚本,它只是循环等待输入行。您写入的行被分成等待时间 time
和重复计数 repeats
。它在等待之后重复该行的其余部分,这意味着在经过少量处理延迟后模拟突发输出。
您可以对此进行试验,以验证如果输出中的任何暂停时间少于 read_nonblocking()
超时,循环将不会完成并且您不会丢失任何数据。更改 size=
参数应该不会有任何影响,只会导致更多循环。显然,您应该选择一个合理短的超时时间,但对于反应不快的命令也不要太短。
我有一个设备,我正在尝试控制它并为它制作一个带有许多不同提示的预期包装器,其中一些可以很容易地在不是提示的其他输出中找到。然而;该设备的输出速度非常快,并且在等待 something 之前从来没有任何功能。那么有没有一种方法可以监视缓冲区的预期并等到它停止更改,然后 return 不使用 'expect' 函数?
您可以尝试使用 pexpect 方法 read_nonblocking(size=,timeout=)
,该方法 return 立即处理任何数据,或者如果在给定时间内未找到第一个字节,则引发超时异常。通过在循环中重复它直到超时,并累积数据,当设备安静时,您将检测到输出结束。考虑代码:
#!/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()
方法循环无限累积读取(是字节,不是字符串),当最后没有更多数据时,超时异常导致它return数据。
为了测试,命令 运行、cmd
是一个 bash shell 脚本,它只是循环等待输入行。您写入的行被分成等待时间 time
和重复计数 repeats
。它在等待之后重复该行的其余部分,这意味着在经过少量处理延迟后模拟突发输出。
您可以对此进行试验,以验证如果输出中的任何暂停时间少于 read_nonblocking()
超时,循环将不会完成并且您不会丢失任何数据。更改 size=
参数应该不会有任何影响,只会导致更多循环。显然,您应该选择一个合理短的超时时间,但对于反应不快的命令也不要太短。