我使用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。
答案 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]\$ '"