使用 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]$ '"
我正在使用 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]$ '"