我正在尝试完成一个循环,停止用户交互。
我的第一个想法是用信号把我带到这里:

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为什么会这样以及如何完成我的任务,我很感激您的任何建议。提前谢谢。

最佳答案

你只缺了一行!

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!”脚本将退出。
为什么需要global interruptLoop
Python不需要在函数作用域中声明变量。它确定函数在本地定义哪些变量的方法是查看设置了哪些变量。因此,当您在interruptLoop = True中设置interrupt_handler时,python将此视为interrupt_handler具有局部变量的提示。这个局部变量隐藏了外部作用域的interruptLoop,python将其视为独立的。因此,您的处理程序基本上只创建一个局部变量,修改它,然后退出。当然,这不会停止循环(这取决于外部作用域的interruptLoop)。global关键字向python发出信号,表明内部变量实际上应该引用外部变量,而不是隐藏它。有关更多信息,请参见here以获取简短解释,并参阅here以获取有关python变量作用域的完整讨论。

关于python - Python交互式循环中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53688970/

10-11 22:22
查看更多