9

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

4

2 回答 2

15

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

try:
    raw_input()
except EOFError:
    pass

更新

使用atexit - 退出处理程序

import atexit

def quit_gracefully():
    print 'Bye'

atexit.register(quit_gracefully)
于 2013-07-15T09:24:29.737 回答
2

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

在这里,评论:

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

t.daemon = True
t.start()

并且每当主线程死了所有线程都会和他一起死^^"

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

于 2017-12-15T09:06:59.540 回答