我正在尝试替换这个丑陋的块:
import signal
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGQUIT, signal_handler)
signal.signal(signal.SIGILL, signal_handler)
signal.signal(signal.SIGPIPE, signal_handler)
用这个:
import signal
for sig in (SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE):
signal.signal(sig, signal_handler)
不幸的是python抛出:
File "./mysuperfile.py", line 107, in <module>
for sig in (SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE):
NameError: name 'SIGINT' is not defined
我也试过
from signal import signal, SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE
..但这会引发:
File "./mysuperfile.py", line 108, in <module>
signal.signal(sig, signal_handler)
AttributeError: 'builtin_function_or_method' object has no attribute 'signal'
问题:正确的语法是什么?
谢谢!
答案 0 :(得分:2)
我可能会这样做:
import signal
for sig in ("SIGINT", "SIGTERM", "SIGQUIT", "SIGILL", "SIGPIPE"):
sig = getattr(signal,sig)
signal.signal(sig, signal_handler)
当您执行简单的import signal
时,您可以在当前命名空间中找到所有信号句柄signal.SIGNALNAME
(例如signal.SIGQUIT
)。这与以下内容相同:
for sig in (signal.SIGINT, signal.SIGTERM, signal.SIGQUIT, ...):
signal.signal(sig,signal_handler)
当然,您可以在尝试时将它们直接导入当前的命名空间:
from signal import signal, SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE
但是signal
函数在当前命名空间中只被称为signal
(不是signal.signal
)。因此,使用该导入,您可以:
for sig in (SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE):
signal(sig, signal_handler)
然而,我发现不太清楚。 signal
是模块还是函数?也许不难理解(毕竟,你不能调用模块),但另一种方式很明显。>
答案 1 :(得分:1)
您无法从自身导入信号,但可以单独导入。
import signal
from signal import SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE