Python调用sys.exit()无法即时终止程序的问题咨询
问题成因
- 按键检测逻辑位置错误:原代码中
if keyboard.is_pressed("p")的判断写在两层旋转循环的外部,程序会按顺序先执行完所有循环内的旋转动作、累计4秒的sleep阻塞等待,全部循环跑完后才会走到按键检测的代码行。循环执行阶段完全没有按键检测逻辑,中途按下p键不会得到任何响应,自然要等所有旋转任务结束才会执行退出。 - 检测逻辑本身存在缺陷:
keyboard.is_pressed()是瞬时状态查询,就算把这行代码挪到循环内部,原代码中每次循环后sleep(0.5)是完全阻塞的,按下p的时机如果刚好落在sleep的阻塞时段,单次查询很容易漏检按键,还是做不到即时响应。
修改方案
用按键回调+循环内高频检测的方式实现,既不会漏检按键,也能做到按下p后立刻终止程序,同时退出前会自动把屏幕复位到正向,避免程序退出后屏幕保持旋转的异常状态。修改后完整代码如下:
import sys import keyboard import rotatescreen from time import sleep pd = rotatescreen.get_primary_display() angel = [90, 180, 270, 0] need_exit = False # 注册p键的按下回调,只要程序运行中按下p就立刻标记退出状态 def trigger_exit(event): global need_exit need_exit = True keyboard.on_press_key("p", trigger_exit) for i in range(2): for x in angel: if need_exit: pd.rotate_to(0) sys.exit(0) pd.rotate_to(x) # 将原来0.5秒的长阻塞拆分为多次短等待,每次等待后都检测退出状态 for _ in range(10): if need_exit: pd.rotate_to(0) sys.exit(0) sleep(0.05)
代码说明
- 全局按键回调不依赖轮询,哪怕程序处于sleep阻塞状态,按下p键也会立刻修改退出标记,不会漏检按键
- 拆分长sleep为短间隔轮询,按下p键后最多延迟0.05秒就会触发退出,感知上是即时生效的
- 退出前自动将屏幕旋转回0度正向,不会留下异常状态
- 注意:运行该程序需要管理员/root权限,否则keyboard库无法全局监听按键,会导致退出逻辑失效。
内容的提问来源于stack exchange,提问作者FeerQ
相关产品推荐
相关产品推荐

