如何在time.sleep()期间捕获pyautogui.FailSafeException异常?
解决休眠期间实时捕获pyautogui安全异常的方案
问题核心在于time.sleep(10)会让程序完全阻塞,这段时间内无法执行任何检查逻辑,导致鼠标移到左上角后要等休眠结束才触发异常。要实现实时捕获,需要把长休眠拆分成多次短休眠,每次休眠后主动触发安全检查。
具体实现代码
import time import pyautogui try: while True: for coords in [(100, 100), (1000, 100), (1000, 1000), (100, 1000)]: pyautogui.moveTo(coords) # 替换原有的time.sleep(10),实现带安全检查的休眠 total_sleep_time = 10 check_interval = 0.1 # 每0.1秒检查一次 elapsed_time = 0 while elapsed_time < total_sleep_time: # 主动触发pyautogui的安全检查 pyautogui.failSafeCheck() time.sleep(check_interval) elapsed_time += check_interval except pyautogui.FailSafeException: # 这里写触发安全机制后的操作 print("安全机制触发,程序停止")
原理说明
- 拆分长休眠:把10秒的连续休眠拆成多个0.1秒的短休眠,避免程序长时间阻塞。
- 主动安全检查:每次短休眠后调用
pyautogui.failSafeCheck(),这个函数会直接检查鼠标是否处于屏幕左上角(0,0),如果是立即抛出FailSafeException,无需等到休眠结束。 - 兼顾精度与性能:0.1秒的间隔既能保证异常触发的及时性,又不会因为过于频繁的检查占用过多系统资源,你也可以根据需求调整这个间隔值。
替代方案(手动检查)
如果不想依赖pyautogui的内置检查函数,也可以手动获取鼠标位置并判断:
# 替换循环内的检查逻辑 while elapsed_time < total_sleep_time: current_pos = pyautogui.position() if current_pos == (0, 0): raise pyautogui.FailSafeException() time.sleep(check_interval) elapsed_time += check_interval
不过更推荐使用failSafeCheck(),因为它会处理pyautogui安全机制的所有细节(比如部分系统的特殊安全位置),兼容性更好。
内容的提问来源于stack exchange,提问作者vshis
相关产品推荐
相关产品推荐

