使用 pexpect 检测 bash 输出的结尾

Use pexpect to detect end of bash output

我正在使用 pexpect 到 运行 一个 bash 实例:

bash = pexpect.spawn("/bin/bash")

我希望能够"expect"结束这个输出。目前我正在使用以下内容:

bash.sendline("ls -ltr")
lines = []
while True:
    try:
        bash.expect("\r\n", timeout=0.1)
        lines.append(bash.before)
    except pexpect.TIMEOUT:
        print "TO"
        break

这是有效的,但似乎无需等待 pexpect.TIMEOUT.

即可检测到输出结束的效率更高

您应该期待您的提示。 假设您的提示是 "s",您的代码应该是:

bash.expect(">")

或者甚至先为您的提示设置一个变量(以防您稍后想要更改您的提示;))

prompt = ">"
bash.expect(prompt)

我在 pexpect 的 pxssh.py 模块中找到了这个很棒的片段 (set_unique_prompt),这是一个修改过的示例:

UNIQUE_PROMPT = "\[PEXPECT\][$\#] "
PROMPT_SET_CSH = "set prompt='[PEXPECT]$ '"
def set_unique_prompt():
    # expect that the default shell prompt will display at least a "> "
    c.expect('>\s+$')
    c.sendline(PROMPT_SET_CSH)
    i = c.expect([pexpect.TIMEOUT, UNIQUE_PROMPT], timeout=2)
    if i == 0:
        print(c.before)
        print(c.after)
        raise Exception("couldn't set CSH shell prompt to something unique that we can match on!")

# start new process
c = pexpect.spawn('csh')
set_unique_prompt()
print("started new shell and renamed it's prompt")

c.sendline('start_long_running_command')
while True:
    i = c.expect([pexpect.TIMEOUT, self.UNIQUE_PROMPT], timeout=5)
    if i:
        break
    else:
        print('command still running')
print('long running command finished')

它基本上启动了一个 shell(在本例中为 CSH),然后它首先将提示签名更改为我们不希望出现在命令输出中的内容(在本例中我们将其设置为“[PEXPECT]$ ”,然后我们可以 EXPECT 唯一提示,所以我们知道 shell 何时完成。

对于 BASH,只需将 PROMPT_SET_CSH 变量更改为 BASH 用于更改其提示字符串的命令... pxssh.py 建议 PROMPT_SET_SH = "PS1='[PEXPECT]$ '"