我正在编写一个使用 Unix less(1) 在终端上显示文本的程序。这是相关部分:
less = subprocess.Popen(['less -F -'], stdin=subprocess.PIPE,
stdout=sys.stdout, shell=True)
try:
less.stdin.write(rfc_text)
less.stdin.flush()
less.stdin = sys.stdin
less.wait()
except IOError:
less.terminate()
return errno.EPIPE
except KeyboardInterrupt:
less.terminate()
return 0
在等待 less 完成时,我监听 KeyboardInterrupt 异常。如果我抓到一个,我会用 SIGTERM 信号减少杀死,然后退出我的程序。
现在,当发生这种情况时,我返回到我的 shell 提示符,但 shell 不再回显我所写的内容,我必须执行 reset(1) 以使其再次运行。
关于如何在不将我的 stdin 带入坟墓的情况下减少死亡的任何想法?完整的源代码可在 https://github.com/jforberg/rfc/blob/master/rfc.py 上找到
编辑: 经过一些试验,我发现 less(1) 和 man(1) 默认情况下都忽略了 control-C 笔划。因此,简单地忽略它可能是一个可行的选择。不过,我不确定我认为这是正确的方法,所以如果有人有建议,我仍然非常感兴趣。
最佳答案
最简单的方法是让用户正确退出less
(按q
):
#!/usr/bin/env python
from subprocess import PIPE, Popen
p = Popen(['less'], stdin=PIPE)
try:
p.communicate(''.join("%d\n" % i for i in range(1000)))
except KeyboardInterrupt:
print("Press `q` to exit.")
p.wait()
关于python - 杀死 less(1) 子进程后输入失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8597049/