pexpect模块中sendline方法的困难

0 投票
1 回答
1547 浏览
提问于 2025-04-17 00:00

我想要自动化面试过程,也就是说,如果面试问题中出现某个特定的字符串,我就给出预设的答案。

我正在使用 pexpect.spawn 来启动一个子进程,并进行面试。

我的代码的一部分是:

child.expect("\> ")

child.sendline("test")

我通过设置 child.logfile=fout 来把面试过程保存到一个文件中。

fout 文件的一部分内容是:

What would you like to use for the display name:^M
> ^M

Invalid input: ''^M

^M

What would you like to use for the display name:^M
> test


test^M

从上面的内容可以看出,第一次匹配到换行符,所以出现了“无效输入:”的提示。这样它就问了同样的问题两次,然后才接受“test”作为答案。

我该怎么做才能让我的答案第一次就被接受呢?

这和 child.expect 中的“timeout”参数有关吗?

我尝试过使用 timeout=0、timeout=-1 等选项,但都没有效果。

1 个回答

0

哇,找到了答案:child.setecho(False)

我花了几个小时在这个问题上,幸运的是这个方法有效。

我觉得问题出在每次我们发送一行命令时,如果这行命令和我们预期的模式(比如我们通常使用的提示符)匹配,那么在结果出来之前,pexpect就会返回。

必须说,我们需要仔细选择期望的模式。一般来说,我按照示例中推荐的方法,设置PS1=[PEXPECT]\$,然后关闭回显,再发送命令来改变PS1,这个过程对我来说是有效的。

撰写回答