Pexpect eats bash 提示

Pexpect eats bash prompt

这个 expect 脚本会启动一个 bash shell,其中包含提示:

#! /usr/bin/env expect

spawn -noecho "bash"

expect "$ "

send "echo 'Hello, "

interact

例如user@host:/path/to/working/directory$ echo 'Hello,

我尝试用 Pexpect 做同样的事情:

#! /usr/bin/env python

import pexpect

child = pexpect.spawn('bash')

index = child.expect("$ ")

child.send("echo 'Hello, ")

child.interact()

然而,它吞下提示,只显示echo 'Hello,。 我可以用 child.sendcontrol('l') 强制 bash 重绘, 但这仅适用于某些 shell; dash, 比如不支持。

$ python
Python 2.7.9 (default, Dec 11 2014, 08:58:12) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pexpect
>>> pexpect.__version__
'3.2'

不是错误,pexpect 确实 "suppress" 直到交互,正如预期的那样,它不知道您稍后会调用交互。

无论如何。如果您想在比赛前看到提示(以及其他任何内容),只需打印即可:

#! /usr/bin/env python
from __future__ import print_function
import pexpect
child = pexpect.spawn('bash')
index = child.expect_exact("$ ")
print(child.before + child.match, end='')
child.interact()

(小心匹配 $,并非所有提示都有它们。如果您打算将其用于任何可移植性,则应注意强制设置 PS1 等, pexpect.replwrap.bash() 函数中的一个例子: https://github.com/pexpect/pexpect/blob/master/pexpect/replwrap.py#L108-113 )

很久没用原来的tcl/expect了,不过好像记得是暗示将所有子程序的输出复制到父进程: 它总是复制标准输出,这就是为什么 tcl/expect 版本在与 "see" 交互之前不需要打印,直到 interact 被调用。

https://github.com/pexpect/pexpect/issues/184#issuecomment-78819460

作为J.F。塞巴斯蒂安表示,还有一个选择:

#! /usr/bin/env python
import pexpect
import sys
child = pexpect.spawn('bash')
child.logfile_read = sys.stdout
index = child.expect_exact("$ ")
child.interact()