我正在尝试完成一个循环,停止用户交互。
我的第一个想法是用信号把我带到这里:
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/