pexpect equivalent of Expect's “send_user”

梦想与她 提交于 2019-12-11 14:56:01

问题


As a continuation from my previous question on building interactive option menus in pexpect, print statements within an interact input filter do not get sent to stdout until after the interact is complete.

The docs don't seem to contain an equivalent method to send_user from expect, is there any workaround to send output to the user, not to the spawned child from within pexpect's interact method?

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$

回答1:


Don't really know why print()'ed data is not automatically flushed when interacting with the spawned child but you can flush it explicitly so it would show up realtime:

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

or just use (only for python3)

# .raw is not buffered
sys.stdout.buffer.raw.write('something')


来源:https://stackoverflow.com/questions/49069887/pexpect-equivalent-of-expects-send-user

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!