Pexpect не может передать ввод более чем на 1024 символа?

В настоящее время я передаю некоторый ввод в процесс с 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 символа, процесс не получает полный ввод, вызывая повышение "pexpect.TIMEOUT" ошибки на p.readline().

Я попытался разбить мой ввод на части размером менее 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(...).

(В качестве побочного примечания я заметил, что такая же ошибка усечения возникает, когда я запускаю "cat" из оболочки и пытаюсь вставить → 1024 символа с "Cmd + V". Однако все работает нормально, если я запустите "pbpaste | cat".)

Спасибо!

Update: Вызов "os.write()" возвращает 1025, что указывает на успешную запись, но os.read() возвращает "\ x07" (единственный символ BEL), а затем зависает при следующем вызове, что приводит к таймауту.

Разделение вызова os.write() на два байта write() s под-1024 байта, разделенных вызовом os.fsync(), ничего не меняет.

Ответ 1

Ваша проблема, похоже, связана с MacOS, посмотрите MacOSX 10.6.7 отключает stdin при 1024 символах.

В основном говорится, что 1024 - это ограничение вашего буфера tty.

Я не эксперт в Mac OS, но, возможно, другие могут дать вам больше информации об этом.

Ответ 2

Я понимаю, что очень поздно, но я отправляю решение для кого-то, кто наткнулся на этот вопрос с той же проблемой (как я уже говорил сегодня).

Основываясь на некоторых ответах/комментариях, я написал такой пакет pexpect, который использует stdin.write и stdout.read вместо того, что использует этот pexpect. У меня не было возможности проверить это было бы очень основательно, но до этого момента он справился с задачей.

Код можно найти здесь: https://github.com/tayyabt/tprocess