如何在处理KeyboardInterrupt后避免打印^C

9 投票
4 回答
2348 浏览
提问于 2025-04-17 03:28

今天早上,我决定在我的服务器程序中处理键盘中断,让程序优雅地退出。我知道怎么做,但我这个挑剔的人觉得,按下 ^C 还会显示出来,这样不够优雅。我该怎么做才能避免显示 ^C 呢?

import sys
from time import sleep
try:
  sleep(5)
except KeyboardInterrupt, ke:
  sys.exit(0)

按下 Ctrl+C 可以退出上面的程序,然后你会看到 ^C 被打印出来。有没有什么 sys.stdoutsys.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)

撰写回答