Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pexpect can';输入不能超过1024个字符?_Python_Macos_Io_Expect_Pexpect - Fatal编程技术网

Python pexpect can';输入不能超过1024个字符?

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

我目前正在使用以下代码将一些输入传递给带有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(…)

(作为旁注,我注意到当我从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。知道如何调试死锁吗?