使用pexpect来检测bash输出的结束

时间:2016-04-25 13:22:51

标签: python bash pexpect

我使用pexpect来运行bash实例:

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

我希望能够“期待”此输出的结束。目前我正在使用以下内容:

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。

2 个答案:

答案 0 :(得分:4)

你应该期待你的提示。 说你的提示是" s",你的代码应该是:

bash.expect(">")

甚至首先为你的提示设置一个变量(如果以后你要改变你的提示;)

prompt = ">"
bash.expect(prompt)

答案 1 :(得分:0)

我在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] $",然后我们可以预测唯一提示,所以我们知道shell何时完成。

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