Python pexpect can';输入不能超过1024个字符?
我目前正在使用以下代码将一些输入传递给带有pexpect的流程:Python pexpect can';输入不能超过1024个字符?,python,macos,io,expect,pexpect,Python,Macos,Io,Expect,Pexpect,我目前正在使用以下代码将一些输入传递给带有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 exc
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(…)
(作为旁注,我注意到当我从shell运行“cat”并尝试用“Cmd+V”粘贴>=1024个字符时,会出现相同的截断错误。但是,如果我运行“pbpaste | cat”,一切都会正常工作。)
谢谢
更新:
对“os.write()”的调用返回1025,表示写入成功,但os.read()返回“\x07”(单字符BEL),然后挂起下一次调用,导致超时
将os.write()调用划分为两个子1024字节的write()调用,并用对os.fsync()的调用分隔开来,这不会改变任何事情。您的问题似乎与MacOS有关,请查看 它基本上说1024是您的tty缓冲区限制
我不是Mac OS的专家,但也许其他人可以给你更多关于这方面的信息。我意识到现在已经很晚了,但我为那些偶然发现这个问题的人发布了一个解决方案(就像我今天早些时候做的那样) 根据一些答案/评论,我编写了一个类似于pexpect的包,它使用stdin.write和stdout.read,而不是pexpect使用的任何东西。我还没有机会彻底测试它,但到目前为止,它已经经受住了挑战 您可以在这里找到代码:在我的例子(Debian Linux)中,限制(4096个字符)与终端的规范处理输入模式有关。报告中对此有一些评论 我通过在发送数据之前关闭佳能模式解决了问题:
p.sendline('stty -icanon')
p.sendline('a'*5000)
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内核版本10.8.0:Tue Jun 7 16:33:36 PDT 2011;root:xnu-1504.15.3~1/release386i386 I386”),关于如何在python级别解决这个问题有什么建议吗?e、 g.通过写入1023字节,刷新缓冲区,然后写入其余的?@tba:从你解释的内容来看,问题似乎在读取端。因此,我认为您使用的是管道方法(正如pbpaste所使用的方法),但我担心这可能会使您使用pexpect的努力付诸东流。不幸的是,将管道与python的“subprocess”一起使用会导致死锁:请参阅上的“警告:”关于使用.stdin.write”。建议的解决方法是使用communicate(),它等待进程终止。这对我不起作用,因为我需要在进程终止之前多次发送和接收信息。@tba:如果需要来回发送/接收信息,请不要使用communicate()
,但不要让这个警告吓到你太多:你可以使用stdin.write
/stdout.read
,你“只是”需要小心。在Unix上,您有(查看一下),而对于跨平台解决方案(也称为Windows),您必须使用线程(查看一下)。谢谢Rik。我以前尝试过stdin.write和stdin.read,但遇到了死锁,因此切换到了pexpect。知道如何调试死锁吗?