You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:54:34