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()
这个 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()