Pexpect吃了bash提示符

时间:2015-03-04 17:13:22

标签: python shell expect pexpect

这个expect脚本启动一个包含提示符的bash shell:

#! /usr/bin/env expect

spawn -noecho "bash"

expect "$ "

send "echo 'Hello, "

interact

e.g。 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,。 我可以强制bash重绘child.sendcontrol('l'), 但这只适用于一些贝壳; 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'

2 个答案:

答案 0 :(得分:2)

正如J.F. Sebastian所说,还有另一种选择:

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

答案 1 :(得分:0)

不是一个错误,pexpect确实"压制"直到互动,因为这是预期的,它不知道你以后会称之为互动。

反正。如果你想在匹配之前看到打印的提示(以及其他任何内容),只需打印它:

#! /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已经很长时间了,但我似乎记得暗示将所有子程序输出复制到父进程:它总是复制stdout,这就是为什么tcl / expect版本在交互之前不需要打印的原因"参见"在调用interact之前放弃了什么。

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