在peexpect中调用sleep bash命令

问题描述 投票:1回答:1

我想打电话给你 sleep 10 命令中 pexpect 送线。但是,pexpect并没有等待睡眠结束。

以下是可以用来重现这个问题的示例。

import pexpect
import sys

child = pexpect.spawn('bash', encoding='utf-8')
child.logfile = sys.stdout
child.expect('~')
child.sendline("date");
child.expect('2020')
child.sendline('sleep 10')
child.expect('~',timeout=12)
child.sendline('date')

请注意。

  1. 我已经知道使用 time.sleep() 然而,在我的要求中,有一个限制(bash命令和预期的输出是由其他工具发送到python代码),这使得我只能使用bash的sleep。 这个例子只是这个问题的一个缩小版。

  2. 修改 ~ 到你的bash提示符来重现这个问题。

python pexpect
1个回答
1
投票

问题是你的 child.expect('~',timeout=12) 立即返回,因为已经有一个旧的 ~ 的缓冲区中,可以匹配。

当你发送 date你会有这样一行字

Tue Jun  9 15:32:45 GMT 2020
~ $ 

然后你期望 2020这就剩下 \r\n~ $ 仍在缓冲区中.你应该总是使用一个匹配,直达下一条命令的提示,或者在发送新命令之前刷新缓冲区。虽然有一个 .flush() 方法,它不会这样做。你可以使用,例如

child.read_nonblocking(size=9999, timeout=.1)
© www.soinside.com 2019 - 2024. All rights reserved.