python列表转化为数字信号_从Python中的数字获取信号名称

从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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值