我目前正在尝试完成一个停止用户交互的循环 .
我的第一个想法是使用信号让我这样:
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 回答
你只错过了一行!
如果你运行它,你会看到打印的数字,直到你点击
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' sinterruptLoop
) .global
关键字向python发出信号,内部变量实际上应该引用外部变量而不是遮蔽它 . 有关更多信息,请参阅here以获取简短说明,并参阅here以获取有关python变量范围的完整讨论 .