【问题标题】:pexpect equivalent of send_user / expect_userpexpect 相当于 send_user / expect_user
【发布时间】:2019-12-22 06:08:01
【问题描述】:

我想将我编写的程序从expect 转换为pexpect,但是api 完全不同,我知道和喜欢expect 的许多功能我还没有弄清楚如何使用在python

我想知道是否有人有一种纯粹与用户互动的方式。在我期望我使用send_userexpect_user 配对时,这种类型的序列通常由衍生进程中观察到的模式或与衍生进程交互时使用的特殊键码触发。

我看到了send_userthis 示例,并尝试打印输入提示,然后是python input() 函数,但我的程序锁定了。

这是一个代码sn-p:

import pexpect
import sys

def input_filter(s):
    if s == b'\004': # ctrl-d
        sys.stdout.write(f'\n\rYou pressed ctrl-d, press y to quit.\r\n')
        sys.stdout.flush()
        i = input()
        if i == 'y':
            return b'\r: ok, bye; exit\r'
        else:
            return b''
    else:
        return s

proc = pexpect.spawn('bash --norc')
proc.interact(input_filter=input_filter)

【问题讨论】:

  • 你真正的需求是什么?
  • 当用户与进程进行交互会话时,用户应该输入一个关键代码以与我的程序进行交互会话,例如从菜单中选择他们想要的程序为他们做。这很可能会触发一个或多个进程的一系列发送/预期。命令完成后,它们应该返回到原始进程的交互中。
  • 如果我可以让我的最小示例接收输入并做出决定(如在 if 语句中),那么我想我可以让我的其余要求正常工作。

标签: python expect pexpect


【解决方案1】:

input_filter() 中调用input() 不起作用。你需要让interact()返回并根据需要重新输入。

请看下面的例子:

[STEP 104] # cat interact.py
#!/usr/bin/env python3

import pexpect, sys

got_ctrl_d = False
def input_filter(s):
    global got_ctrl_d

    if s == b'\x04':
        got_ctrl_d = True
        # \x1d (CTRL-]) is the default escape char
        return b'\x1d'
    else:
        return s

proc = pexpect.spawn('bash --norc')

while True:
    got_ctrl_d = False
    proc.interact(input_filter=input_filter)
    if got_ctrl_d:
        sys.stdout.write('\nAre you sure to exit? [y/n] ')
        inp = input()

        if inp == 'y':
            proc.sendline('exit')
            break
        else:
            # press ENTER so we can see the next prompt
            proc.send('\r')
    else:
        break

proc.expect(pexpect.EOF)

试试看:

[STEP 105] # python3 interact.py
bash-5.0#                         <-- press CTRL-D
Are you sure to exit? [y/n] n     <-- input 'n' and press ENTER

bash-5.0#                         <-- press CTRL-D
Are you sure to exit? [y/n] y     <-- input 'y' and press ENTER
[STEP 106] #

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多