【发布时间】:2012-02-09 20:46:24
【问题描述】:
我目前正在使用以下代码将一些输入传递给具有 pexpect 的进程:
p = pexpect.spawn('cat', timeout=5.0 )
p.maxread = 5000
p.setecho(False) # prevent the process from echoing stdin back to us
INPUT_LEN = 1024
p.sendline('a'*INPUT_LEN)
print p.readline() # pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
当 INPUT_LEN 对于 >= 1024 个字符,进程不会收到完整的输入,导致 p.readline() 上出现“pexpect.TIMEOUT”错误.
我尝试将我的输入分成小于 1024 个字符的部分,但这也有同样的问题:
p = pexpect.spawn('cat', timeout=5.0 )
p.maxread = 5000
p.setecho(False)
INPUT_LEN = 1024
p.send('a'*1000)
p.sendline('a'*(INPUT_LEN-1000))
print p.readline() # pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
有谁知道如何让 pexpect 处理超过 1024 个字符的输入?我尝试查看源代码,但它似乎只是在调用 os.write(...)。
(作为旁注,我注意到当我从 shell 运行“cat”并尝试使用“Cmd+V”粘贴 >=1024 个字符时,会发生相同的截断错误。但是,如果我一切正常运行“pbpaste | cat”。)
谢谢!
更新: 调用“os.write()”返回1025,表示写入成功,但是os.read()返回“\x07”(单字符BEL),然后在下一次调用时挂起,导致超时。
将 os.write() 调用分成两个 1024 字节以下的 write(),由调用 os.fsync() 分隔,不会改变任何内容。
【问题讨论】:
-
pexpect.spawn应该有一个maxdata关键字默认设置为2000,所以这可能不适用于您的情况,但是您是否尝试过增加它? -
不幸的是,这不起作用;查看最新编辑
-
对不起,我写了maxdata,但我的意思是
maxread,我想这值得一试。 -
深入挖掘源代码我发现它使用了
pty和fcntl,这可能是您的1024 缓冲区限制的根源。能否提供python版本和平台? -
python 版本是“Python 2.7”,平台是 OSX 10.6.8(“Darwin tba.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011;根:xnu-1504.15.3~1/RELEASE_I386 i386")
标签: python macos io expect pexpect