预计相当于 send_user / expect_user
pexpect equivalent of send_user / expect_user
我想将我编写的程序从 expect
转换为 pexpect
,但是 api 完全不同,而且我知道并喜欢 [=] 的许多功能13=]我还没有弄清楚如何在python
中使用。
我想知道是否有人有办法与用户进行纯粹的交互。期望我使用 send_user
与 expect_user
配对,这种类型的序列通常由在派生进程中观察到的模式或与派生进程交互中使用的特殊键代码触发。
我看到了 send_user
的 示例,并尝试打印输入提示,然后是 python
input()
函数,但我的程序锁定了。
这是一个代码片段:
import pexpect
import sys
def input_filter(s):
if s == b'[=12=]4': # ctrl-d
sys.stdout.write(f'\n\rYou pressed ctrl-d, press y to quit.\r\n')
sys.stdout.flush()
i = input()
if i == 'y':
return b'\r: ok, bye; exit\r'
else:
return b''
else:
return s
proc = pexpect.spawn('bash --norc')
proc.interact(input_filter=input_filter)
从 input_filter()
中调用 input()
无效。您需要制作 interact()
return 并根据需要重新输入。
参见以下示例:
[STEP 104] # cat interact.py
#!/usr/bin/env python3
import pexpect, sys
got_ctrl_d = False
def input_filter(s):
global got_ctrl_d
if s == b'\x04':
got_ctrl_d = True
# \x1d (CTRL-]) is the default escape char
return b'\x1d'
else:
return s
proc = pexpect.spawn('bash --norc')
while True:
got_ctrl_d = False
proc.interact(input_filter=input_filter)
if got_ctrl_d:
sys.stdout.write('\nAre you sure to exit? [y/n] ')
inp = input()
if inp == 'y':
proc.sendline('exit')
break
else:
# press ENTER so we can see the next prompt
proc.send('\r')
else:
break
proc.expect(pexpect.EOF)
试一试:
[STEP 105] # python3 interact.py
bash-5.0# <-- press CTRL-D
Are you sure to exit? [y/n] n <-- input 'n' and press ENTER
bash-5.0# <-- press CTRL-D
Are you sure to exit? [y/n] y <-- input 'y' and press ENTER
[STEP 106] #
我想将我编写的程序从 expect
转换为 pexpect
,但是 api 完全不同,而且我知道并喜欢 [=] 的许多功能13=]我还没有弄清楚如何在python
中使用。
我想知道是否有人有办法与用户进行纯粹的交互。期望我使用 send_user
与 expect_user
配对,这种类型的序列通常由在派生进程中观察到的模式或与派生进程交互中使用的特殊键代码触发。
我看到了 send_user
的 python
input()
函数,但我的程序锁定了。
这是一个代码片段:
import pexpect
import sys
def input_filter(s):
if s == b'[=12=]4': # ctrl-d
sys.stdout.write(f'\n\rYou pressed ctrl-d, press y to quit.\r\n')
sys.stdout.flush()
i = input()
if i == 'y':
return b'\r: ok, bye; exit\r'
else:
return b''
else:
return s
proc = pexpect.spawn('bash --norc')
proc.interact(input_filter=input_filter)
从 input_filter()
中调用 input()
无效。您需要制作 interact()
return 并根据需要重新输入。
参见以下示例:
[STEP 104] # cat interact.py
#!/usr/bin/env python3
import pexpect, sys
got_ctrl_d = False
def input_filter(s):
global got_ctrl_d
if s == b'\x04':
got_ctrl_d = True
# \x1d (CTRL-]) is the default escape char
return b'\x1d'
else:
return s
proc = pexpect.spawn('bash --norc')
while True:
got_ctrl_d = False
proc.interact(input_filter=input_filter)
if got_ctrl_d:
sys.stdout.write('\nAre you sure to exit? [y/n] ')
inp = input()
if inp == 'y':
proc.sendline('exit')
break
else:
# press ENTER so we can see the next prompt
proc.send('\r')
else:
break
proc.expect(pexpect.EOF)
试一试:
[STEP 105] # python3 interact.py
bash-5.0# <-- press CTRL-D
Are you sure to exit? [y/n] n <-- input 'n' and press ENTER
bash-5.0# <-- press CTRL-D
Are you sure to exit? [y/n] y <-- input 'y' and press ENTER
[STEP 106] #