【发布时间】:2012-01-25 16:35:58
【问题描述】:
我正在编写一个程序,它使用 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) 以使其再次工作。
关于如何在不将我的标准输入带入坟墓的情况下减少死亡的任何想法?完整源代码在https://github.com/jforberg/rfc/blob/master/rfc.py
编辑:经过一些试验,我发现 less(1) 和 man(1) 默认忽略 control-C 笔画。因此,简单地忽略它可能是一个可行的选择。我不确定我是否认为这是正确的方法,所以如果有人有建议我仍然非常感兴趣。
【问题讨论】:
-
作为一种廉价的解决方法,您可以在脚本末尾添加
os.system('reset')。正确的解决方案可能包括礼貌地停止less,即将一个 sigint 和 'q' 写入它的标准输入,然后等待它完成。 -
@wim 是您的“正确解决方案”:当然!我没有想到要少写'q'。即使经过一段时间的 Linux 编程,我仍然需要提醒我一切都是文件。请将其移至答案中,我会接受。
-
由于没有
setpgid技巧,less应该与您的 Python 进程在同一个进程组中,因此它会收到与您的 Python 进程相同的 ^C。不过,我想它会尝试进行自己的特殊处理……如何使用-e(--quit-at-eof) 以便在您的程序挂起后退出?
标签: python unix subprocess