从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)
7个解决方案
61 votes
通过在Python 3.5中添加enum enum,现在变得很容易:
>>> import signal
>>> signal.SIGINT.name
'SIGINT'
>>> signal.SIGINT.value
2
>>> signal.Signals(2).name
'SIGINT'
>>> signal.Signals['SIGINT'].value
2
pR0Ps answered 2020-02-22T19:19:53Z
34 votes
没有,但是如果您不介意一点hack,可以这样生成它:
import signal
dict((k, v) for v, k in reversed(sorted(signal.__dict__.items()))
if v.startswith('SIG') and not v.startswith('SIG_'))
Wolph answered 2020-02-22T19:19:33Z
12 votes
Python Standard Library By Example在信号一章中显示了此功能:
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]
devin_s answered 2020-02-22T19:20:18Z
3 votes
我在相同的情况下发现了这篇文章,并发现处理程序一次只处理一个信号,所以我什至不需要一整个字典,只需要一个信号的名称即可:
sig_name = tuple((v) for v, k in signal.__dict__.iteritems() if k == signum)[0]
可能有一种不需要tuple(...)[0]位的表示法,但我似乎无法弄清楚。
ssc answered 2020-02-22T19:20:43Z
1 votes
好吧2759207085985970818048在底部说:
DATA
NSIG = 23
SIGABRT = 22
SIGBREAK = 21
SIGFPE = 8
SIGILL = 4
SIGINT = 2
SIGSEGV = 11
SIGTERM = 15
SIG_DFL = 0
SIG_IGN = 1
所以这应该工作:
sig_names = {23:"NSIG", 22:"SIGABRT", 21:"SIGBREAK", 8:"SIGFPE", 4:"SIGILL",
2:"SIGINT", 11:"SIGSEGV", 15:"SIGTERM", 0:"SIG_DFL", 1:"SIG_IGN"}
Daniel G answered 2020-02-22T19:21:07Z
0 votes
建立在另一个答案上:
import signal
if hasattr(signal, "Signals"):
def _signal_name(signum):
try:
return signal.Signals(signum).name
except ValueError:
pass
else:
def _signal_name(signum):
for n, v in sorted(signal.__dict__.items()):
if v != signum:
continue
if n.startswith("SIG") and not n.startswith("SIG_"):
return n
def signal_name(signum):
if signal.SIGRTMIN <= signum <= signal.SIGRTMAX:
return "SIGRTMIN+{}".format(signum - signal.SIGRTMIN)
x = _signal_name(signum)
if x is None:
# raise ValueError for invalid signals
signal.getsignal(signum)
x = "".format(signum)
return x
Roger Pate answered 2020-02-22T19:21:27Z
0 votes
对于正数(信号号)或负值(子过程的返回状态)的signal_value:
import signal
signal_name = {
getattr(signal, _signame): _signame
for _signame in dir(signal)
if _signame.startswith('SIG')
}.get(abs(signal_value), 'Unknown')
user6331769 answered 2020-02-22T19:21:47Z