如何在处理KeyboardInterrupt后避免打印^C
今天早上,我决定在我的服务器程序中处理键盘中断,让程序优雅地退出。我知道怎么做,但我这个挑剔的人觉得,按下 ^C
还会显示出来,这样不够优雅。我该怎么做才能避免显示 ^C
呢?
import sys
from time import sleep
try:
sleep(5)
except KeyboardInterrupt, ke:
sys.exit(0)
按下 Ctrl+C 可以退出上面的程序,然后你会看到 ^C
被打印出来。有没有什么 sys.stdout
或 sys.stdin
的技巧可以用呢?
4 个回答
8
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。为了帮助大家更好地理解这些问题,下面的内容将用简单的语言来解释。
首先,了解你正在使用的工具或库是非常重要的。每个工具都有自己的特点和用法,掌握这些可以帮助你更有效地解决问题。
其次,遇到问题时,不要害怕去查找资料。网络上有很多资源,比如教程、论坛和问答网站,这些地方可以找到很多有用的信息。
最后,记得多动手实践。编程最好的学习方式就是通过实际操作来理解各种概念和技巧。遇到问题时,尝试自己解决,或者向他人请教,这样才能不断进步。
try:
while True:
pass
except KeyboardInterrupt:
print "\r "
9
这是你的命令行工具在干的事,跟python没有关系。
如果你在 ~/.inputrc
文件里加上下面这一行,它就会停止这种行为:
set echo-control-characters off
当然,我是默认你在用bash,可能你并不是用这个。
1
这个方法在Linux系统上是有效的。
#! /usr/bin/env python
import sys
import termios
import copy
from time import sleep
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = copy.deepcopy(old)
new[3] = new[3] & ~termios.ECHO
try:
termios.tcsetattr(fd, termios.TCSADRAIN, new)
sleep(5)
except KeyboardInterrupt, ke:
pass
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
sys.exit(0)