pexpect эквивалент send_user от Expect

В продолжение моего предыдущего вопроса о создании интерактивных меню параметров в pexpect напечатайте операторы в фильтре ввода взаимодействия не отправляются на стандартный вывод до тех пор, пока взаимодействие не будет завершено.

Документы, похоже, не содержат эквивалентного метода send_user из expect, есть ли какое-либо обходное решение для отправки вывода пользователю, а не порожденному дочернему элементу из метода взаимодействия pexpect?

bash-4.1$ cat testInputFilter.py
import pexpect

def input_filter(s):
    if s == b'\003':
        print('you pushed ctrl+c')
        return b'\r: r u going to kill me? press ctrl-d to exit!\r'
    elif s == b'\004':
        print('you pushed ctrl+d')
        return b'\r: ok, bye; exit\r'
    else:
        return s

proc = pexpect.spawn('bash --norc')
proc.interact(input_filter=input_filter)
proc.expect(pexpect.EOF)
bash-4.1$ ~/python/python36/bin/python3.6 testInputFilter.py | tee inputTest.txt
bash-4.1$
bash-4.1$ : r u going to kill me? press ctrl-d to exit!
bash-4.1$
bash-4.1$ : ok, bye; exit
exit
you pushed ctrl+c
you pushed ctrl+d
bash-4.1$

person Chris    schedule 02.03.2018    source источник
comment
Что, если вы этого не сделаете | tee inputTest.txt?   -  person    schedule 02.03.2018
comment
Что ж, это так, и я чувствую себя глупо, но я нахожу это странным, поскольку не следует перенаправлять как на стандартный вывод, так и в файл? Разве не в этом вся цель? Думаю, мне просто придется использовать регистратор.   -  person Chris    schedule 02.03.2018


Ответы (2)


На самом деле не знаю, почему данные, добавленные в print(), не сбрасываются автоматически при взаимодействии с дочерним элементом spawn ed, но вы можете очистить его явно, поэтому он будет отображаться в реальном времени:

print('something')
sys.stdout.flush()

или просто используйте (только для python3)

# .raw is not buffered
sys.stdout.buffer.raw.write('something')
person pynexj    schedule 02.03.2018

Я обнаружил, что печать на экране дает странное смещение, основанное на том, что ранее было распечатано созданным процессом, и что следующий вывод порожденных процессов также был смещен на странную величину. В итоге я сделал следующее:

    sys.stdout.write(f'\n\rsomething\r\n')
    sys.stdout.flush()

Это печатает мой something в начале новой строки, а затем запускает вывод порожденных процессов в начале следующей строки.

person shortcipher3    schedule 22.12.2019