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

2024-04-27 09:49:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在后台线程中运行的服务器,我使用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控制台。


Tags: import命令self服务器键入initdef线程
2条回答

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

以下是评论:

“您始终可以将线程设置为“守护程序”线程,如:

t.daemon = True
t.start()

只要主线死了,所有的线都会和他一起死

感谢OP的提问,感谢评论作者的分享。

使用原始输入(使用Python3.x中的输入)。按Ctrl+D将导致eoferor异常。

try:
    raw_input()
except EOFError:
    pass

更新

使用atexit - Exit handlers

import atexit

def quit_gracefully():
    print 'Bye'

atexit.register(quit_gracefully)

相关问题 更多 >