如何在python交互式控制台中捕获“Ctrl-D”?

时间:2013-07-15 09:22:37

标签: python console

我有一个服务器在后台运行一个线程,我使用python -i启动它,这样我就可以获得一个交互式控制台,我可以输入命令并轻松调试它。但是当我按下Ctrl-D时,由于服务器仍在后台线程中运行,因此控制台不会退出。如何捕获Ctrl-D事件以便我可以关闭服务器并正常退出?我知道如何用信号捕获Ctrl-C,但是由于我按住Ctrl-D的习惯,我通常会遇到一个“卡住”的终端,这真的很烦人。

谢谢!

服务器代码(简化)如下:

import threading
import atexit

class WorkerThread(threading.Thread):
    def __init__(self):
        super(WorkerThread, self).__init__()
        self.quit = False

    def run(self):
        while not self.quit:
            pass

    def stop(self):
        self.quit = True

def q():
    print "Goodbye!"
    t.stop()

atexit.register(q)

t = WorkerThread()
t.start()

我使用python -i test.py运行它来获取python控制台。

2 个答案:

答案 0 :(得分:9)

使用raw_input(在Python 3.x中使用输入)。按Ctrl + D将导致EOFError异常。

try:
    raw_input()
except EOFError:
    pass

<强>更新

使用atexit - Exit handlers

import atexit

def quit_gracefully():
    print 'Bye'

atexit.register(quit_gracefully)

答案 1 :(得分:2)

我和你一样有同样的问题我已经修好了。我在这里的评论中找到了一个很好的答案:http://www.regexprn.com/2010/05/killing-multithreaded-python-programs.html?showComment=1336485652446#c8921788477121158557

这里,评论:

&#34;您始终可以将线程设置为&#34;守护程序&#34;线程如:​​

t.daemon = True
t.start()

每当主线程死亡时,所有线程都将与他一起死亡^^&#34;

感谢OP提出他的问题,并感谢评论作者的分享。