Ответ 1
Нет, но если вы не против небольшого взлома, вы можете создать его так:
import signal
dict((k, v) for v, k in reversed(sorted(signal.__dict__.items()))
if v.startswith('SIG') and not v.startswith('SIG_'))
Есть ли способ сопоставить номер сигнала (например, 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)
Нет, но если вы не против небольшого взлома, вы можете создать его так:
import signal
dict((k, v) for v, k in reversed(sorted(signal.__dict__.items()))
if v.startswith('SIG') and not v.startswith('SIG_'))
С добавлением signal.Signals
enum
в Python 3.5 это сейчас так же просто, как:
>>> import signal
>>> signal.SIGINT.name
'SIGINT'
>>> signal.SIGINT.value
2
>>> signal.Signals(2).name
'SIGINT'
>>> signal.Signals['SIGINT'].value
2
Стандартная библиотека 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]
Я нашел эту статью, когда был в той же ситуации, и решил, что обработчик обрабатывает только один сигнал за раз, поэтому мне даже не нужен целый словарь, просто имя одного сигнала:
sig_name = tuple((v) for v, k in signal.__dict__.iteritems() if k == signum)[0]
вероятно, есть нотация, которая не нуждается в бите кортежа (...) [0], но я не могу понять, что это.
Ну, help(signal)
говорит внизу:
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"}
Основываясь на другом ответе:
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 = "<signal {}>".format(signum)
return x