我正在使用以下代码将一些输入传递给具有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,一切正常,但是对于> = 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().
有没有人知道如何使用超过1024个字符的输入使pexpect工作?我试着查看源代码,但它似乎只是调用os.write(...)。
(作为旁注,我注意到当我从shell运行“cat”并尝试使用“Cmd + V”粘贴> = 1024个字符时发生相同的截断错误。但是,一切正常我跑“pbpaste | cat”。)
谢谢!
更新 对“os.write()”的调用返回1025,表示写入成功,但os.read()返回“\ x07”(单个字符BEL),然后在下一次调用时挂起,导致超时。 / p>
将os.write()调用分为两个1024字节的write(),由os.fsync()调用分隔,不会改变任何内容。
答案 0 :(得分:5)
您的问题似乎与MacOS有关,请查看MacOSX 10.6.7 cuts off stdin at 1024 chars。
它基本上说1024是你的tty缓冲限制。
我不是Mac OS专家,但也许其他人可以为您提供更多有关此问题的信息。
答案 1 :(得分:1)
我意识到这已经非常晚了,但是我正在为那些遇到同样问题而遇到这个问题的人发布一个解决方案(就像我今天早些时候做的那样)。
根据一些答案/评论,我编写了一个类似pexpect的包,它使用stdin.write和stdout.read而不是pexpect使用的任何东西。我没有机会对它进行彻底的测试,但到目前为止,它已经经受住了挑战。
您可以在此处找到代码:https://github.com/tayyabt/tprocess
答案 2 :(得分:1)
在我的情况下(Debian Linux),限制(4096个字符)与终端的规范处理输入模式有关。 pexpect documentation中对此有一些评论。
我通过在发送数据之前关闭佳能模式解决了我的问题:
p.sendline('stty -icanon')
p.sendline('a'*5000)