Pexpect 超时与来自 Child 的大块数据



我正在使用 pexpect 调用另一个提示raw_input的 python 脚本 (py27)。我正在尝试围绕此脚本构建 GUI 包装器而不对其进行修改。

我遇到的问题是,在下一个命令提示符之前执行时,我调用的脚本返回了大量数据(例如,10KB)。我知道 pexpect 在处理大量数据时遇到困难。child.expect调用总是超时,无论我传递什么值。如何处理大型数据集?我已经学会了通过手动读取child.expect.read(X)来管理它的方法,但这很笨拙。有某种缓冲正在进行,我不知道如何干净地解决它。脚本返回数据不会丢弃,需要解析,所以我不能只让线程始终读取,除非它可以以某种方式写入文件。

编辑:

下面是一个示例。我使用的是 Windows 10 并使用 Py2.7

test2.py(可以修改此脚本,但不能修改 test1.py)

import pexpect
from pexpect import popen_spawn
import time
child = pexpect.popen_spawn.PopenSpawn("python test1.py", maxread=1)
# send hello to child
child.sendline("hello")
# wait for command prompt ">"
child.expect(">", timeout=30)

test1.py(对我的真实脚本的行为进行建模,在开始时打印一大块数据,命令完成时返回">"作为提示,无法修改此脚本)

import sys
# print a bunch of data
for i in range(2000):
print(i)
try:
while True:
# ask for input
x = raw_input(">")
except KeyboardInterrupt:
sys.exit("Manually quit")

回溯(最近一次调用): 文件 "test2.py",第 23 行,在 child.expect(">", timeout=10) 文件 "C:************\AppData\Local\conda\conda\envs\py27\lib\site-packages\pexpect\spawnbase.py",第 327 行,在期望中 超时、搜索窗口大小async_) 文件 "C:************\AppData\Local\conda\conda\envs\py27\lib\site-packages\pexpect\spawnbase.py",第 355 行,expect_list 返回exp.expect_loop(超时) 文件 "C:************\AppData\Local\conda\conda\envs\py27\lib\site-packages\pexpect\expect.py",第 106 行,expect_loop 返回 self.timeout(e) 文件 "C:************\AppData\Local\conda\conda\envs\py27\lib\site-packages\pexpect\expect.py",第 70 行,超时 提高超时(消息) pexpect.exceptions.TIMEOUT: 搜索者: searcher_re: 0: re.compile(">") 搜索者: searcher_re: 0: re.compile(">")

如果您确定该提示肯定会出现,并且您的方案可以永远等待,那么在预期中使用 timeout=None 将无限期地等待提示出现。 但是,是的,无限期等待有其自身的负面影响。 我建议仅在 100% 确定会出现提示并且无限期等待不是问题时才使用此方法。

相关内容

  • 没有找到相关文章

最新更新