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

Bri*_*unt 47 python signals

有没有办法将信号编号(例如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)
Run Code Online (Sandbox Code Playgroud)

对于一些字典sig_names,所以当进程收到SIGINT时会打印:

Received signal (SIGINT)
Run Code Online (Sandbox Code Playgroud)

pR0*_*0Ps 62

随着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
Run Code Online (Sandbox Code Playgroud)

  • pylint-3.7 给了我这个:`E1101:模块'信号'没有'信号'成员(无成员)`。为什么会出现这种情况?pylint 没有“看到”枚举吗? (5认同)
  • 对于Py3用户来说,这是一个很好的答案。 (3认同)

Wol*_*lph 34

没有,但如果你不介意一点点黑客,你可以像这样生成它:

import signal
dict((k, v) for v, k in reversed(sorted(signal.__dict__.items()))
     if v.startswith('SIG') and not v.startswith('SIG_'))
Run Code Online (Sandbox Code Playgroud)

  • @ tbc0:排序是为了给出一致的信号列表,因为列表中有重复项,所以最需要它 (2认同)

dev*_*n_s 12

Python标准库按示例在信号章节中显示了此功能:

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

然后你可以像这样使用它:

print "Terminated by signal %s" % SIGNALS_TO_NAMES_DICT[signal_number]
Run Code Online (Sandbox Code Playgroud)

  • 或者(可能稍微更优选)`SIGNALS_TO_NAMES_DICT.get(signal_number,"未命名信号:%d"%signal_number) (2认同)

Pir*_*ish 7

从 Python 3.8 开始,您现在可以使用signal.strsignal()方法返回信号的文本描述:

>>> signal.strsignal(signal.SIGTERM)
'Terminated'

>>> signal.strsignal(signal.SIGKILL)
'Killed'
Run Code Online (Sandbox Code Playgroud)