python - 如何监视 pexpect 缓冲区的更改
问题描述
我有一个设备,我正在尝试控制并制作一个带有许多不同提示的 pexpect 包装器,其中一些可以很容易地在其他不是提示的输出中找到。然而; 该设备的输出速度非常快,并且永远不会有任何功能等待而无需输出。那么有没有办法监视缓冲区的 pexpect 并等到它停止更改,然后在不使用'expect'函数的情况下返回它?
解决方案
您可以尝试使用 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=
参数应该没有任何效果。显然,您应该选择一个相当短的超时,但对于反应不快的命令来说也不能太短。
推荐阅读
- django - 芹菜任务不保存模型
- c# - 未正确读取 JSON 文件
- docker - .Net 5 Kestrel 落后于 Kubernetes 负载均衡器无法识别的 HTTP 版本
- c# - 拥有众多消费者的实时数据生产者
- cucumber - 在小黄瓜背景中放置一个需要每个 secnario 不同数据的步骤
- php - yii2 高级项目资产:不允许加载本地资源
- java - 如果子字符串是数字,是否有更好的签入选项?
- spring-boot - 使用 Neo4j/Spring 引导检索自定义属性
- reactjs - React-Table:指定可选列(取决于结果集的可用性)
- r - Tidyverse 解决方案:按组跨行求和,保留其他列