杀死less(1)子进程后输入失败

jfo*_*erg 5 python unix subprocess

我正在编写一个程序,使用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
Run Code Online (Sandbox Code Playgroud)

在等待较少完成时,我会监听KeyboardInterrupt异常.如果我抓到一个,我用SIGTERM信号减少了,并退出我的程序.

现在,当发生这种情况时,我将返回到我的shell提示符,但shell不再回应我写的内容,我必须重置(1)以使其再次工作.

关于如何减少死亡而不将我的stdin带入坟墓的任何想法?完整的资源可以在https://github.com/jforberg/rfc/blob/master/rfc.py上找到

编辑:经过一些实验,我发现默认情况下,less(1)和man(1)都忽略了control-C笔划.所以简单地忽略它可能是一个可行的选择.我不确定我认为这是正确的做法,所以如果有人有建议我仍然非常感兴趣.

jfs*_*jfs 1

最简单的方法是要求用户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()
Run Code Online (Sandbox Code Playgroud)