pexpect 相当于 Expect 的 "send_user"
pexpect equivalent of Expect's "send_user"
作为我 在 pexpect 中构建交互式选项菜单的延续,交互输入过滤器中的打印语句在交互完成之前不会发送到标准输出。
文档似乎不包含与来自 expect 的 send_user 等效的方法,是否有任何解决方法可以将输出发送给用户,而不是从 pexpect 的交互方法中生成的 child ?
bash-4.1$ cat testInputFilter.py
import pexpect
def input_filter(s):
if s == b'[=11=]3':
print('you pushed ctrl+c')
return b'\r: r u going to kill me? press ctrl-d to exit!\r'
elif s == b'[=11=]4':
print('you pushed ctrl+d')
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)
bash-4.1$ ~/python/python36/bin/python3.6 testInputFilter.py | tee inputTest.txt
bash-4.1$
bash-4.1$ : r u going to kill me? press ctrl-d to exit!
bash-4.1$
bash-4.1$ : ok, bye; exit
exit
you pushed ctrl+c
you pushed ctrl+d
bash-4.1$
真的不知道为什么 print()
ed 数据在与 spawned 交互时不会自动 flushed child 但您可以 显式刷新 它会实时显示:
print('something')
sys.stdout.flush()
或仅使用(仅适用于 python3)
# .raw is not buffered
sys.stdout.buffer.raw.write('something')
我发现打印到屏幕会产生一个奇怪的偏移量,这是基于先前由衍生进程打印出的内容,并且衍生进程的下一个输出也有一个奇怪的偏移量。我最终做的是:
sys.stdout.write(f'\n\rsomething\r\n')
sys.stdout.flush()
这会在新行的开头打印我的 something
,然后在下一行的开头开始生成的进程输出。
作为我
文档似乎不包含与来自 expect 的 send_user 等效的方法,是否有任何解决方法可以将输出发送给用户,而不是从 pexpect 的交互方法中生成的 child ?
bash-4.1$ cat testInputFilter.py
import pexpect
def input_filter(s):
if s == b'[=11=]3':
print('you pushed ctrl+c')
return b'\r: r u going to kill me? press ctrl-d to exit!\r'
elif s == b'[=11=]4':
print('you pushed ctrl+d')
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)
bash-4.1$ ~/python/python36/bin/python3.6 testInputFilter.py | tee inputTest.txt
bash-4.1$
bash-4.1$ : r u going to kill me? press ctrl-d to exit!
bash-4.1$
bash-4.1$ : ok, bye; exit
exit
you pushed ctrl+c
you pushed ctrl+d
bash-4.1$
真的不知道为什么 print()
ed 数据在与 spawned 交互时不会自动 flushed child 但您可以 显式刷新 它会实时显示:
print('something')
sys.stdout.flush()
或仅使用(仅适用于 python3)
# .raw is not buffered
sys.stdout.buffer.raw.write('something')
我发现打印到屏幕会产生一个奇怪的偏移量,这是基于先前由衍生进程打印出的内容,并且衍生进程的下一个输出也有一个奇怪的偏移量。我最终做的是:
sys.stdout.write(f'\n\rsomething\r\n')
sys.stdout.flush()
这会在新行的开头打印我的 something
,然后在下一行的开头开始生成的进程输出。