11

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

有谁知道如何使 pexpect 使用超过 1024 个字符的输入?我尝试查看源代码,但它似乎只是在调用 os.write(...)。

(附带说明一下,当我从 shell 运行“cat”并尝试使用“Cmd+V”粘贴 >=1024 个字符时,我注意到同样的截断错误。但是,如果我运行“pbpaste”,一切正常| 猫”。)

谢谢!

更新: 调用“os.write()”返回1025,表示写入成功,但是os.read()返回“\x07”(单字符BEL),然后在下一次调用时挂起,导致超时.

将 os.write() 调用分成两个 1024 字节以下的 write(),由调用 os.fsync() 分隔,不会改变任何内容。

4

3 回答 3

5

您的问题似乎与 MacOS 相关,请查看MacOSX 10.6.7 cut off stdin at 1024 chars

它基本上说 1024 是您的 tty 缓冲区限制。

我不是 Mac OS 方面的专家,但也许其他人可以为您提供有关此的更多信息。

于 2012-02-09T23:33:54.790 回答
1

我意识到已经很晚了,但是我正在为遇到同样问题的人发布一个解决方案(就像我今天早些时候所做的那样)。

根据一些答案/评论,我编写了一个类似 pexpect 的包,它使用 stdin.write 和 stdout.read 而不是 pexpect 使用的任何东西。我还没有机会非常彻底地测试它,但到目前为止,它已经经受住了挑战。

你可以在这里找到代码:https ://github.com/tayyabt/tprocess

于 2015-05-26T12:53:21.993 回答
1

在我的情况下(Debian Linux),限制(4096 个字符)与终端的规范处理输入模式有关。pexpect 文档中对此有一些评论。

我通过在发送数据之前关闭佳能模式解决了我的问题:

p.sendline('stty -icanon')
p.sendline('a'*5000)
于 2020-07-20T20:17:26.897 回答