1 回答

TA贡献1900条经验 获得超5个赞
你只缺了一行!
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,此时你会看到“我完成了!” 并且脚本将退出。
为什么global interruptLoop需要?
Python 不要求您在函数范围内声明变量。它确定为函数在本地定义了哪些变量的方法是查看设置了哪些变量。因此,当您设置interruptLoop = Truein 时interrupt_handler,python 将其视为interrupt_handler具有局部变量的提示。这个局部变量隐藏了外部作用域的interruptLoop,python 将其视为单独的。所以你的处理程序本质上只是创建一个局部变量,修改它,然后退出。当然,这不会停止循环(这取决于外部作用域的interruptLoop)。的global关键字信号蟒,内变量实际上应该引用外层一个而非阴影它。有关更多信息,请参阅此处的简短说明和此处 有关 python 变量作用域的完整讨论。
添加回答
举报