【问题标题】:How can I capture 'Ctrl-D' in python interactive console?如何在 python 交互式控制台中捕获“Ctrl-D”?
【发布时间】:2013-07-15 09:22:36
【问题描述】:

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

【问题讨论】:

    标签: python console


    【解决方案1】:

    使用 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)
    

    【讨论】:

    • 服务器不读取任何输入,而是使用 python -i 在 python 控制台中运行。控制台是让我输入python表达式来调试服务器的。
    • @ChiZhang,在t.start()之前致电t.setDaemon(True)
    • 我可以使用Getch(stackoverflow.com/a/510364/2402577) 捕获它吗? @falsetru
    • @alper,请发表单独的问题而不是评论,以便其他人回答您。
    • 我能够通过将捕获的字符与"\x04"进行比较来处理它
    【解决方案2】:

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

    这里是评论:

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

    t.daemon = True
    t.start()
    

    而且每当主线程死掉时,所有线程都会和他一起死去^^"

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

    【讨论】:

    • IMO 这是正确的答案,如果有一个非守护线程正在运行并且你按^D 那么atexit 不会救你。
    猜你喜欢
    • 2023-03-28
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2014-02-28
    • 2018-05-26
    • 2017-02-11
    • 2014-10-11
    相关资源
    最近更新 更多