我正在使用 pexpect 调用另一个提示输入 raw_input 的 python 脚本 (py27)。我试图围绕这个脚本构建一个 GUI 包装器而不修改它。
我遇到的问题是,我调用的脚本在下一个命令提示符之前执行时返回了大量数据(例如 10KB)。我知道 pexpect 难以处理大量数据。这child.expect
无论我传递什么值,调用总是会超时。如何处理大数据集?我已经学会了通过手动读取来管理此问题的方法child.expect.read(X)
,但这很hacky。正在进行某种缓冲,我不知道如何干净地解决它。脚本返回的数据不会被丢弃,需要进行解析,因此我不能让线程始终读取,除非它可以以某种方式写入文件。
EDIT:
这是一个例子。我使用的是 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(">", 超时=10)
文件“C:************ \ AppData \ Local \ conda \ conda \ envs \ py27 \ lib \ site-packages \ pexpect \ spawnbase.py”,第327行,在expect中
超时、searchwindowsize、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: 重新编译(">")
搜索者: searcher_re:
0: 重新编译(">")