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

标签 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 控制台。

最佳答案

使用 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 - 如何在 python 交互式控制台中捕获 'Ctrl-D'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17650754/

相关文章:

python - 即使专门包含,cx-freeze 也无法包含模块

python - 将包含多行字符串的 Pandas 系列行拆分为单独的行

python - 在 Python 中从 FTP 文件夹(文件名有空格)获取最新文件

c# - 如何在不降低应用程序速度的情况下将冗长的控制台重定向到 C# 中的 TextBox

Java/ Selenium : Still getting "ChromeDriver was started successfully" message after disabling logging

delphi - 如何在Delphi中将二进制数据写入stdout?

python - 如何检查列表中的项目是否在另一个列表中?

python - 在中间逗号处将字符串一分为二?

node.js - 如何格式化 Mongoose 调试输出 - pretty-print

.net - Azure WebJob 日志控制台显示错误的符号,但 IDE 控制台显示正确的输出