
pyautogui自0.9.41版本起,`locateonscreen()`在未找到图像时默认抛出`imagenotfoundexception`而非返回`none`,这是其设计行为;推荐使用`try/except`捕获异常,或改用`locateallonscreen()`配合`next()`实现无异常的空值判断。
PyAutoGUI 的图像定位函数(如 locateOnScreen())在设计上遵循“显式优于隐式”的 Python 哲学:当目标图像未被识别时,它主动抛出 pyautogui.ImageNotFoundException 异常,而非静默返回 None。这一变更自 v0.9.41 起生效,目的是避免因误判 None 而掩盖逻辑错误(例如路径错误、截图模糊、缩放不匹配等)。因此,直接对返回值做 != None 判断会导致 UnboundLocalError 或运行时异常——因为函数根本不会返回 None。
✅ 推荐方案一:标准异常处理(最清晰、最Pythonic)
这是官方文档明确倡导的方式,语义明确、调试友好:
import pyautogui
import time
while True:
try:
# 若找到图像,返回 Box(left, top, width, height);否则抛出 ImageNotFoundException
location = pyautogui.locateOnScreen("1.png", confidence=0.9)
print("I can see it")
except pyautogui.ImageNotFoundException:
print("I cannot see it")
time.sleep(0.5)✅ 推荐方案二:无异常替代函数(locateAllOnScreen + next)
若坚持避免 try/except,可利用 locateAllOnScreen() —— 它返回一个生成器,未匹配时生成空序列,此时 next(..., default) 可安全返回指定默认值(如 None):
import pyautogui
import time
while True:
# locateAllOnScreen 返回匹配位置的迭代器;next(..., None) 在无结果时返回 None
match = next(pyautogui.locateAllOnScreen("1.png", confidence=0.9), None)
if match is not None:
print("I can see it")
else:
print("I cannot see it")
time.sleep(0.5)⚠️ 注意事项:
- locateAllOnScreen 性能略低于 locateOnScreen(需遍历全屏匹配),但对单图检测场景差异可忽略;
- 确保 "1.png" 是高对比度、无压缩失真的截图,且与屏幕实际显示内容分辨率、缩放比例(如 Windows 缩放125%)严格一致;
- 建议始终设置 confidence 参数(如 0.8–0.95),提升抗噪能力;
- 首次运行前调用 pyautogui.FAILSAFE = True(默认开启),防止脚本失控——移动鼠标到屏幕左上角可强制中断。
总结:异常不是缺陷,而是 PyAutoGUI 对图像识别不确定性的明确反馈。拥抱 try/except 不仅符合 Python 惯例,更能让你在日志中精准定位失败原因(如文件缺失、权限不足、DPI不匹配),远胜于隐藏失败的“静默模式”。










