在预期中创建交互式选项
Creating interactive options in pexpect
这是一个笨拙的问题,因为我想不出一个好的方式来描述它,但希望你可以这样做:
interact {
[=10=]1 {do_something}
[=10=]3 {do_something_else}
"?" {
set timeout 1
expect_user {
"?" {send "?"}
timeout {send_user "show a menu of the things you can do"}
}
stty raw -echo
set timeout 60
}
5 {send "^]"
send "quit\r"
send_user "\n"
exit
}
}
这将创建一个交互式会话,用户可以在其中照常处理业务,但在按下键盘组合键时 (ctrl+a , ctrl+c, ctrl+e, ?等)执行操作或显示描述可能的快捷方式的文本。
我正在尝试将一些脚本更新到 python 和预期,但无法弄清楚这在预期中是否可行。我尝试使用输入过滤器,但似乎这不是真正的 'right' 地方,或者我似乎无法找到任何好的例子。
@pynexj:尝试了您的脚本,但我在 stdout 上没有从 ctrl 命令获得任何信息。
16:51:16 ~/scripts $ p3 testInputFilter.py | tee testInput.txt
16:51:19 ~/scripts $ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
usr 45721 0.0 0.0 109620 1876 pts/1 Ss 16:49 0:00 -ksh
usr 46622 0.0 0.0 108436 1776 pts/1 S 16:51 0:00 bash
usr 46734 5.5 0.0 135728 7688 pts/1 S+ 16:51 0:00 python3.6 testI
usr 46735 0.0 0.0 100912 632 pts/1 S+ 16:51 0:00 tee testInput.t
usr 46736 0.0 0.0 108336 1692 pts/5 Ss 16:51 0:00 /bin/bash --nor
usr 46759 0.0 0.0 110236 1132 pts/5 R+ 16:51 0:00 ps u
16:51:21 ~/scripts $ ^C
16:51:42 ~/scripts $ exit
16:51:43 ~/scripts $ cat testInput.txt
16:51:19 ~/scripts $ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
usr 45721 0.0 0.0 109620 1876 pts/1 Ss 16:49 0:00 -ksh
usr 46622 0.0 0.0 108436 1776 pts/1 S 16:51 0:00 bash
usr 46734 5.5 0.0 135728 7688 pts/1 S+ 16:51 0:00 python3.6 testI
usr 46735 0.0 0.0 100912 632 pts/1 S+ 16:51 0:00 tee testInput.t
usr 46736 0.0 0.0 108336 1692 pts/5 Ss 16:51 0:00 /bin/bash --nor
usr 46759 0.0 0.0 110236 1132 pts/5 R+ 16:51 0:00 ps u
16:51:21 ~/scripts $ ^C
16:51:42 ~/scripts $ exit
16:51:57 ~/scripts $
参见以下示例(适用于 Python2 和 Python3):
[STEP 114] # cat foo.py
import pexpect
def input_filter(s):
if s == b'\x03':
return b'\r: r u going to kill me? press ctrl-d to exit!\r'
elif s == b'\x04':
return b'\r: ok, bye; exit\r'
else:
return s
proc = pexpect.spawn('bash --norc')
proc.interact(input_filter=input_filter)
proc.expect(pexpect.EOF)
[STEP 115] # python foo.py
bash-4.4# ps <-- user input
PID TTY TIME CMD
77616 pts/56 00:00:00 bash
77617 pts/56 00:00:00 ps
bash-4.4# <-- press CTRL-C
bash-4.4# : r u going to kill me? press ctrl-d to exit!
bash-4.4# <-- press CTRL-D
bash-4.4# : ok, bye; exit
exit
[STEP 116] #
这是一个笨拙的问题,因为我想不出一个好的方式来描述它,但希望你可以这样做:
interact {
[=10=]1 {do_something}
[=10=]3 {do_something_else}
"?" {
set timeout 1
expect_user {
"?" {send "?"}
timeout {send_user "show a menu of the things you can do"}
}
stty raw -echo
set timeout 60
}
5 {send "^]"
send "quit\r"
send_user "\n"
exit
}
}
这将创建一个交互式会话,用户可以在其中照常处理业务,但在按下键盘组合键时 (ctrl+a , ctrl+c, ctrl+e, ?等)执行操作或显示描述可能的快捷方式的文本。
我正在尝试将一些脚本更新到 python 和预期,但无法弄清楚这在预期中是否可行。我尝试使用输入过滤器,但似乎这不是真正的 'right' 地方,或者我似乎无法找到任何好的例子。
@pynexj:尝试了您的脚本,但我在 stdout 上没有从 ctrl 命令获得任何信息。
16:51:16 ~/scripts $ p3 testInputFilter.py | tee testInput.txt
16:51:19 ~/scripts $ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
usr 45721 0.0 0.0 109620 1876 pts/1 Ss 16:49 0:00 -ksh
usr 46622 0.0 0.0 108436 1776 pts/1 S 16:51 0:00 bash
usr 46734 5.5 0.0 135728 7688 pts/1 S+ 16:51 0:00 python3.6 testI
usr 46735 0.0 0.0 100912 632 pts/1 S+ 16:51 0:00 tee testInput.t
usr 46736 0.0 0.0 108336 1692 pts/5 Ss 16:51 0:00 /bin/bash --nor
usr 46759 0.0 0.0 110236 1132 pts/5 R+ 16:51 0:00 ps u
16:51:21 ~/scripts $ ^C
16:51:42 ~/scripts $ exit
16:51:43 ~/scripts $ cat testInput.txt
16:51:19 ~/scripts $ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
usr 45721 0.0 0.0 109620 1876 pts/1 Ss 16:49 0:00 -ksh
usr 46622 0.0 0.0 108436 1776 pts/1 S 16:51 0:00 bash
usr 46734 5.5 0.0 135728 7688 pts/1 S+ 16:51 0:00 python3.6 testI
usr 46735 0.0 0.0 100912 632 pts/1 S+ 16:51 0:00 tee testInput.t
usr 46736 0.0 0.0 108336 1692 pts/5 Ss 16:51 0:00 /bin/bash --nor
usr 46759 0.0 0.0 110236 1132 pts/5 R+ 16:51 0:00 ps u
16:51:21 ~/scripts $ ^C
16:51:42 ~/scripts $ exit
16:51:57 ~/scripts $
参见以下示例(适用于 Python2 和 Python3):
[STEP 114] # cat foo.py
import pexpect
def input_filter(s):
if s == b'\x03':
return b'\r: r u going to kill me? press ctrl-d to exit!\r'
elif s == b'\x04':
return b'\r: ok, bye; exit\r'
else:
return s
proc = pexpect.spawn('bash --norc')
proc.interact(input_filter=input_filter)
proc.expect(pexpect.EOF)
[STEP 115] # python foo.py
bash-4.4# ps <-- user input
PID TTY TIME CMD
77616 pts/56 00:00:00 bash
77617 pts/56 00:00:00 ps
bash-4.4# <-- press CTRL-C
bash-4.4# : r u going to kill me? press ctrl-d to exit!
bash-4.4# <-- press CTRL-D
bash-4.4# : ok, bye; exit
exit
[STEP 116] #