pexpect无法传递超过1024个字符的输入?
我现在正在用 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().
当输入长度小于 1024 时,一切都很正常,但当输入长度大于等于 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(...)。
(顺便提一下,我注意到当我在命令行中运行 "cat" 并尝试用 "Cmd+V" 粘贴大于等于 1024 个字符时,也会出现同样的截断错误。不过,如果我运行 "pbpaste | cat",一切就正常了。)
谢谢!
更新: 调用 "os.write()" 返回 1025,表示写入成功,但 os.read() 返回的是 "\x07"(一个字符 BEL),然后在下一次调用时就卡住了,导致超时。
把 os.write() 的调用分成两个小于 1024 字节的 write(),中间加一个 os.fsync() 的调用,也没有改变任何情况。
3 个回答
在我的情况下(使用的是Debian Linux),限制(4096个字符)与终端的规范处理输入模式有关。关于这一点,在pexpect文档中有一些评论。
我通过在发送数据之前关闭规范模式来解决了我的问题:
p.sendline('stty -icanon')
p.sendline('a'*5000)
我知道现在已经很晚了,但我还是想给那些遇到同样问题的人分享一个解决方案(就像我今天早些时候遇到的那样)。
根据一些回答和评论,我写了一个类似于pexpect的包,它使用stdin.write和stdout.read,而不是pexpect使用的其他方法。我还没有机会进行非常彻底的测试,但到目前为止,它都能应对各种挑战。
你可以在这里找到代码:https://github.com/tayyabt/tprocess
你的问题看起来跟MacOS有关,可以看看这个链接:MacOSX 10.6.7在1024个字符时截断标准输入。
简单来说,这里提到的1024是你的终端缓冲区的限制。
我对Mac OS不是很专业,但也许其他人能给你更多的信息。