Python Interactive Loop-Break - PullRequest
       14

Python Interactive Loop-Break

0 голосов
/ 09 декабря 2018

В настоящее время я пытаюсь выполнить цикл, который останавливается при взаимодействии с пользователем.

Моя первая идея состояла в том, чтобы использовать сигналы, которые привели меня к следующему:

import signal

interruptLoop = False
def interrupt_handler(sig, frame):
        interruptLoop = True
signal.signal(signal.SIGINT, interrupt_handler) # handle ctrl+c

count = 0
while not interruptLoop:
    print count; count += 1

это приводит кбесконечный цикл, поскольку возникновение interruptLoop не влияет на переменную вне области действия обработчика.

Буду признателен за любой совет о том, почему python / signal ведет себя так и как выполнять мою задачу.Заранее спасибо.

1 Ответ

0 голосов
/ 09 декабря 2018

Вам не хватает только одной строки!

import signal

interruptLoop = False
def interrupt_handler(sig, frame):
        global  interruptLoop  # You're missing this
        interruptLoop = True
signal.signal(signal.SIGINT, interrupt_handler) # handle ctrl+c

count = 0
while not interruptLoop:
    print(count); count += 1
print("I'm done!")

Если вы запустите это, вы увидите напечатанные цифры, пока не нажмете Ctrl+C, и в этот момент вы увидите: «Ясделанный!"и скрипт завершится.

Почему был необходим global interruptLoop?

Python не требует, чтобы вы объявляли переменные в своей области действия функции.Чтобы определить, какие переменные определены локально для функции, нужно посмотреть, какие переменные установлены.Поэтому, когда вы устанавливаете interruptLoop = True в interrupt_handler, python видит это как сигнал, что interrupt_handler имеет локальную переменную.Эта локальная переменная затеняет внешнюю область видимости interruptLoop, которую питон рассматривает как отдельную.Таким образом, ваш обработчик, по сути, просто создает локальную переменную, модифицирует ее и затем завершает работу.Конечно, это не останавливает цикл (который зависит от внешней области видимости interruptLoop).Ключевое слово global сигнализирует python, что внутренняя переменная должна ссылаться на внешнюю, а не скрывать ее.Для получения дополнительной информации см. здесь для краткого объяснения и здесь для полного обсуждения переменной области видимости Python.

...