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().

1024文字を超える入力でpexpectを機能させる方法を知っている人はいますか? ソースを見てみましたが、os.write(...)を呼んでいるようです。

(補足として、シェルから「cat」を実行し、「Cmd + V」で >=1024 文字を貼り付けようとすると、同じ切り捨てエラーが発生することに気付きました。ただし、「pbpaste」を実行すると、すべて正常に動作します。 | 猫" .)

ありがとう!

更新: 「os.write()」への呼び出しは 1025 を返し、書き込みが成功したことを示しますが、os.read() は「\x07」(1 文字の BEL) を返し、次の呼び出しでハングし、タイムアウトが発生します。 .

os.write() 呼び出しを 2 つのサブ 1024 バイトの write() に分割し、os.fsync() への呼び出しで分離しても、何も変わりません。

4

3 に答える 3

5

あなたの問題は MacOS に関連しているようです。MacOSX 10.6.7 cuts off stdin at 1024 chars をご覧ください。

基本的に、1024 が tty バッファーの制限であると言っています。

私は Mac OS の専門家ではありませんが、他の人がこれについて詳しく教えてくれるかもしれません。

于 2012-02-09T23:33:54.790 に答える
1

私の場合 (Debian Linux) の制限 (4096 文字) は、端末の正規処理入力モードに関連していました。pexpect documentationには、それに関するコメントがいくつかあります。

データを送信する前にキヤノンモードをオフにすることで問題を解決しました。

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