【问题标题】:pexpect equivalent of Expect's "send_user"pexpect 相当于 Expect 的“send_user”
【发布时间】:2018-03-02 13:15:46
【问题描述】:

作为我 previous question 在 pexpect 中构建交互式选项菜单的延续,交互输入过滤器中的打印语句在交互完成之前不会发送到标准输出。

文档似乎不包含与期望的 send_user 等效的方法,是否有任何解决方法可以将输出发送给用户,而不是从 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$

【问题讨论】:

  • 如果你不| tee inputTest.txt怎么办?
  • 嗯,这样做了,我觉得很愚蠢,但我觉得这很奇怪,因为 tee 不应该同时重定向到标准输出和文件?这不就是全部目的吗?我想我只需要改用记录器。

标签: python expect pexpect


【解决方案1】:

真的不知道为什么print()'ed 数据在与 spawned 孩子交互时不会自动flushed,但您可以flush em> 明确显示,以便实时显示:

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

或者只是使用(仅适用于 python3)

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

【讨论】:

    【解决方案2】:

    我发现打印到屏幕上会产生一个奇怪的偏移量,该偏移量基于生成的进程先前打印的内容,并且生成的进程的下一个输出也偏移了一个奇怪的量。我最终做的是:

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

    这会在新行的开头打印我的something,然后在下一行的开头开始生成的进程输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-09
      • 2017-09-08
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2018-06-07
      • 2015-01-06
      • 1970-01-01
      相关资源
      最近更新 更多