这个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'
答案 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