首页 文章

Python交互式循环中断

提问于
浏览
3

我目前正在尝试完成一个停止用户交互的循环 .

我的第一个想法是使用信号让我这样:

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

  • 1

    你只错过了一行!

    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 ,此时你会看到"I'm done!"并且脚本将退出 .

    Why was the global interruptLoop needed?

    Python不要求您在函数范围中声明变量 . 它确定函数本地定义的变量的方式是查看设置了哪些变量 . 因此,当您在 interrupt_handler 中设置 interruptLoop = True 时,python将此视为 interrupt_handler 具有局部变量的提示 . 这个局部变量会影响外部作用域的 interruptLoop ,python将其视为单独的 . 所以你的处理程序基本上只是创建一个局部变量,修改它,然后退出 . 当然这不是't stop the loop (which depends on the outer scope' s interruptLoop ) . global 关键字向python发出信号,内部变量实际上应该引用外部变量而不是遮蔽它 . 有关更多信息,请参阅here以获取简短说明,并参阅here以获取有关python变量范围的完整讨论 .

相关问题