pexpect超时与来自孩子的大块数据

时间:2018-01-24 01:14:50

标签: python timeout pexpect

我正在使用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行,in     child.expect(">",超时= 10)   文件" C:************ \ AppData \ Local \ conda \ conda \ envs \ py27 \ lib \ site-packages \ pexpect \ spawnbase.py",第327行,期待     超时,searchwindowsize,async_)   文件" C:************ \ AppData \ Local \ conda \ conda \ envs \ py27 \ lib \ site-packages \ pexpect \ spawnbase.py",第355行,在expect_list中     return exp.expect_loop(timeout)   文件" 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行,在超时     提高TIMEOUT(msg) pexpect.exceptions.TIMEOUT: 搜索者:searcher_re:     0:re.compile(">") 搜索者:searcher_re:     0:re.compile(">")

1 个答案:

答案 0 :(得分:0)

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