Python交互式循环中断

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


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


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 表现得像这样以及如何完成我的任务的任何建议。提前致谢。


鸿蒙传说
浏览 182回答 1
1回答

梵蒂冈之花

你只缺了一行!import signalinterruptLoop = Falsedef interrupt_handler(sig, frame):        global  interruptLoop  # You're missing this        interruptLoop = Truesignal.signal(signal.SIGINT, interrupt_handler) # handle ctrl+ccount = 0while not interruptLoop:    print(count); count += 1print("I'm done!")如果你运行这个,你会看到打印出来的数字,直到你点击Ctrl+C,此时你会看到“我完成了!” 并且脚本将退出。为什么global interruptLoop需要?Python 不要求您在函数范围内声明变量。它确定为函数在本地定义了哪些变量的方法是查看设置了哪些变量。因此,当您设置interruptLoop = Truein 时interrupt_handler,python 将其视为interrupt_handler具有局部变量的提示。这个局部变量隐藏了外部作用域的interruptLoop,python 将其视为单独的。所以你的处理程序本质上只是创建一个局部变量,修改它,然后退出。当然,这不会停止循环(这取决于外部作用域的interruptLoop)。的global关键字信号蟒,内变量实际上应该引用外层一个而非阴影它。有关更多信息,请参阅此处的简短说明和此处 有关 python 变量作用域的完整讨论。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python