Нужно понимать сигналы и модули Python - PullRequest
3 голосов
/ 24 марта 2010

Я пытаюсь освоиться с Python, пытаюсь заменить на него немного Си. У меня возникла проблема с обменом данными между модулями, или, скорее, с моим пониманием всего этого. У меня есть модуль сигнала, который упрощен:

import sys, signal

sigterm_caught = False

def SignalHandler(signum, stackframe):
  if signum == signal.SIGTERM:
    sigterm_caught = True
    sys.stdout.write("SIGTERM caught\n")

def SignalSetup():
  signal.signal(signal.SIGTERM, SignalHandler)

и мой основной код имеет такой цикл:

signals.SignalSetup()
while signals.sigterm_caught == False:
  sys.stdout.write("sigterm_caught=%s\n" % str(signals.sigterm_caught))
  time.sleep(5)

Я запускаю его, затем убиваю процесс, внутри signal.py он получает сигнал, устанавливает для sigterm_caught значение True, но цикл в основном процессе не видит изменения значения sigterm_caught.

Так (а) мой подход совершенно неверен для пути Python? (б) я делаю что-то не так, пытаясь ссылаться на переменные в модуле? и (c) я должен обрабатывать сигналы по-другому, например, вызывать исключение?

Дополнение: Лучше обрабатывать сигналы, вызывая исключение, или мой старый подход к Си все еще действителен?

Ответы [ 2 ]

8 голосов
/ 24 марта 2010

Вам нужно добавить оператор global в обработчик:

def SignalHandler(signum, stackframe):
  global sigterm_caught
  if signum == signal.SIGTERM:
    sigterm_caught = True
    sys.stdout.write("SIGTERM caught\n")

Компилятор Python по умолчанию считает каждое имя (например, sigterm_caught) локальным для функции, если кажется, что функция присваивается имени; роль оператора global состоит в том, чтобы изменить это значение по умолчанию, чтобы компилятор Python считал имя global (то есть топ-именем уровня модуля).

3 голосов
/ 24 марта 2010

Если вы записываете в глобальную переменную, используйте global:

sigterm_caught = False

def SignalHandler(signum, stackframe):
  global sigterm_caught
  if signum == signal.SIGTERM:
    sigterm_caught = True
    sys.stdout.write("SIGTERM caught\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...