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

标签 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

在等待 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/

相关文章:

linux - XCB 准备好投入生产了吗?我应该改用 Xlib 吗?

python - 如何检查子进程是否正确终止?

python - 如何在最后 5 分钟内更改文件

python - 如何返回放入字典中的第一个最高值

.net - 从多页 TIFF 文件中删除/删除页面

python - 如何将嵌套字典中的键输出到csv

c++ - 使用GDB查找某个函数对应的内存地址/调试

shell - 什么是 .shar 文件?

python - 如果应用程序崩溃,如何让子进程不被卡住?

linux - 使用子进程在 Python 中运行 linux 命令时出错