
pyautogui自0.9.41版本起,`locateonscreen()`在未找到图像时抛出`imagenotfoundexception`而非返回`none`,因此直接判空会失效;本文详解两种无需`try/except`的替代方案,并推荐更健壮的实践方式。
在使用 PyAutoGUI 进行屏幕图像识别时,一个常见误区是认为 pyautogui.locateOnScreen() 在找不到目标图像时会返回 None,从而可以像普通函数一样用 if result is not None: 判断。但自 v0.9.41 起,该函数在匹配失败时会主动抛出 pyautogui.ImageNotFoundException 异常——这是有意为之的设计变更,符合 Python “显式优于隐式” 和“异常用于异常情况”的哲学。
虽然 try/except 是最直接、最符合 Python 惯例的处理方式(且性能开销极小),但若你希望完全避免显式异常捕获,有两种实用替代方案:
✅ 方案一:使用 locateAllOnScreen() + next()(推荐无异常写法)
locateAllOnScreen() 返回一个生成器(generator),当无匹配时生成器为空;配合 next(..., default) 可安全获取首个匹配位置或返回默认值:
import pyautogui
import time
while True:
# 尝试获取第一个匹配位置,未找到则返回 None
pos = next(pyautogui.locateAllOnScreen("1.png", confidence=0.9), None)
if pos is not None:
print("I can see it")
else:
print("I cannot see it")
time.sleep(0.5)⚠️ 注意:locateAllOnScreen() 仍会进行完整屏幕扫描,性能略低于 locateOnScreen()(后者找到首个即止),但对单图检测场景差异可忽略。
✅ 方案二:封装为“静默版”查找函数
你也可以自行封装一个兼容旧行为的工具函数,内部消化异常并统一返回 None 或坐标:
def safe_locate(image_path, **kwargs):
try:
return pyautogui.locateOnScreen(image_path, **kwargs)
except pyautogui.ImageNotFoundException:
return None
# 使用方式(与原始直觉一致)
while True:
if safe_locate("1.png", confidence=0.9):
print("I can see it")
else:
print("I cannot see it")
time.sleep(0.5)? 补充建议
- 始终设置 confidence 参数(如 confidence=0.8~0.95),尤其在截图存在缩放、抗锯齿或轻微色差时,能显著提升鲁棒性;
- 确保图像文件路径正确且格式支持(PNG 推荐,需与屏幕色彩模式一致);
- 避免在循环中高频调用:可结合 grayscale=True 加速,或添加 minSearchTime=0.5 防止过快重试;
- 生产环境仍建议优先用 try/except:它语义清晰、调试友好,且 PyAutoGUI 明确将查找失败视为“异常流”,而非常规返回值。
综上,locateAllOnScreen + next() 是满足“不写 try/except”需求的简洁解法;而封装函数则兼顾可读性与复用性。无论哪种,核心在于理解 PyAutoGUI 的异常设计意图——让开发者明确区分“成功匹配”与“未找到”这两种本质不同的状态。










