为了账号安全,请及时绑定邮箱和手机立即绑定

Python交互式循环中断

Python交互式循环中断

鸿蒙传说 2021-09-11 16:00:56
我目前正在尝试完成一个停止用户交互的循环。我的第一个想法是使用让我想到这一点的信号:import signalinterruptLoop = Falsedef interrupt_handler(sig, frame):        interruptLoop = Truesignal.signal(signal.SIGINT, interrupt_handler) # handle ctrl+ccount = 0while not interruptLoop:    print count; count += 1这会导致无限循环,因为interruptLoop 的出现不会影响处理程序范围之外的变量。我很感激关于为什么 python/signal 表现得像这样以及如何完成我的任务的任何建议。提前致谢。
查看完整描述

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 变量作用域的完整讨论。


查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信