Python - 使用'import signal'处理CTRL+D

5 投票
1 回答
10634 浏览
提问于 2025-04-17 21:20

我现在可以通过下面的代码来处理 CTRL+C 的操作:

def hand_inter(signum, frame):
    print 'hey, nice job.'

signal.signal(signal.SIGINT, hand_inter)

不过,我还需要处理 CTRL+D,但是找不到合适的 "signal.CTRL+D" 调用来处理这个信号。

1 个回答

3

Ctrl+D 不是一个信号,它表示输入结束。

如果你在使用一个交互式程序,通常你会在读取用户输入,这时按下 Ctrl+D 就是用户告诉程序“我输入完了”。在其他情况下,这个组合键没有特别的意义。

在这个操作之后执行的代码通常是“readline”或类似的调用。它就像读取其他文件一样,当文件结束时会告诉你没有更多的数据可以读取。

举个例子,这可以是一个简单的交互式程序:

import sys

while True:
    line = sys.stdin.readline()    # readline will return "" on EOF
    if line:
        do_something_with(line)    # * if user just pressed Enter line will
                                   #   be "\n", i.e. still True
    else:                          # * user pressed C-D, i.e. stdin has been
        sys.exit(0)                #   closed readline call must have returned ""

另一方面,Ctrl+C 是不同的,它是用户告诉终端停止正在运行的程序的方式。这个操作可以在任何时候发生,不管程序是否在等待输入,或者是否关心外部的事情。

因为程序无法预料到这个操作,所以你需要用 signal 来设置所谓的“陷阱”,这是操作系统提供的一种机制,让程序可以说:“如果你想要结束我,请执行这个操作...” (这个操作可以是任何事情,包括什么都不做,也就是忽略这个信号)。不过,有些特殊的信号,比如 SIGKILL,是程序无法捕获的。

撰写回答