0

私はこの醜いブロックを置き換えようとしています:

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'

質問: 正しい構文は何ですか?

ありがとうございました!

4

2 に答える 2

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(not ) として知られています。signal.signalしたがって、そのインポートを使用して、次のことができます。

for sig in (SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE):
    signal(sig, signal_handler)

しかし、それはあまり明確ではないと思います。モジュールですかsignal、関数ですか。理解するのはそれほど難しくないかもしれません (結局のところ、モジュールを呼び出すことはできません) が、他の方法ではすぐに明らかです。

于 2013-03-31T00:26:08.037 に答える
1

シグナル自体をインポートすることはできませんが、両方を別々にインポートすることはできます。

import signal
from signal import SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE
于 2013-03-31T00:23:52.417 に答える