pexpect не может передать ввод более 1024 символов? - PullRequest
11 голосов
/ 10 февраля 2012

В настоящее время я передаю некоторый ввод в процесс с 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, все работает нормально, но <strong>для> = 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».)

Спасибо!

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

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

Ответы [ 2 ]

5 голосов
/ 10 февраля 2012

Ваша проблема, похоже, связана с MacOS, взгляните на MacOSX 10.6.7 обрезает стандартный ввод в 1024 символа .

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

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

1 голос
/ 26 мая 2015

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

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

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

...