gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:30:10 26 4
gpt4 key购买 nike

我正在编写一个使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com