如何正确导入+循环导入的变量

时间:2013-03-31 00:14:30

标签: python python-2.7

我正在尝试替换这个丑陋的块:

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'

问题:正确的语法是什么?

谢谢!

2 个答案:

答案 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