从数字获取Python中的信号名称
有没有办法把信号编号(比如说 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