从数字获取Python中的信号名称

71 投票
8 回答
24164 浏览
提问于 2025-04-15 21:04

有没有办法把信号编号(比如说 signal.SIGINT)转换成它对应的名字(也就是 "SIGINT")呢?

我想在收到信号的时候能在日志里打印出这个信号的名字,但我在Python里找不到信号编号和名字之间的对应关系,比如说:

import signal
def signal_handler(signum, frame):
    logging.debug("Received signal (%s)" % sig_names[signum])

signal.signal(signal.SIGINT, signal_handler)

我想要一个字典 sig_names,这样当程序收到 SIGINT 信号时,它就能打印出:

Received signal (SIGINT)

8 个回答

12

《Python标准库示例》这本书在讲信号的章节中展示了这个函数:

SIGNALS_TO_NAMES_DICT = dict((getattr(signal, n), n) \
    for n in dir(signal) if n.startswith('SIG') and '_' not in n )

你可以像这样使用它:

print "Terminated by signal %s" % SIGNALS_TO_NAMES_DICT[signal_number]
35

没有现成的办法,不过如果你不介意用点小技巧,可以这样生成:

import signal
dict((k, v) for v, k in reversed(sorted(signal.__dict__.items()))
     if v.startswith('SIG') and not v.startswith('SIG_'))
131

在Python 3.5中,新增了一个叫做 signal.Signals 的功能,还有一个叫做 enum 的工具,现在使用起来变得非常简单:

>>> import signal
>>> signal.SIGINT.name
'SIGINT'
>>> signal.SIGINT.value
2
>>> signal.Signals(2).name
'SIGINT'
>>> signal.Signals['SIGINT'].value
2

撰写回答