Как получить доступ к локальным переменным при обработке события ctrl-C? - PullRequest
3 голосов
/ 19 марта 2019

Мне было интересно, возможно ли получить доступ к переменным, локальным для функции, выполняемой в тот момент, когда ctrl-C прерывает поток. Пример, где main () выполняется при нажатии ctrl-C:

def main(myInfo):
    signal.signal(signal.SIGINT, KeyboardBreak)
    reportOut(myInfo)

def KeyboardBreak(signum, frame):
    reportOut(myInfo)

def reportOut(myInfo):
    print myInfo

Я бы хотел, чтобы reportOut () выполнялся независимо от того, идет ли main () до того места, где он вызывает reportOut (), или поток прерывается.

1 Ответ

1 голос
/ 19 марта 2019

Вашему обработчику сигнала необходим доступ к переменной myInfo.Самый простой способ сделать это - определить KeyboardBreak() внутри main(), чтобы он имел доступ к myInfo через замыкание.

def main(myInfo):

    def KeyboardBreak(signum, frame):
        reportOut(myInfo)

    signal.signal(signal.SIGINT, KeyboardBreak)
    reportOut(myInfo)

def reportOut(myInfo):
    print myInfo

Кроме того, вы можете написать фабрикуфункция, которая создает ваш обработчик сигнала, снова используя замыкание для удержания myInfo.Этот подход, вероятно, лучше всего подходит, когда любая из этих функций является сложной.

def main(myInfo):
    signal.signal(signal.SIGINT, KeyboardBreakFactory(myinfo))
    reportOut(myInfo)

def KeyboardBreakFactory(myinfo):

    def KeyboardBreak(signum, frame):
        reportOut(myInfo)

    return KeyboardBreak

def reportOut(myInfo):
    print myInfo
...