Pyautogui运行时触发cannot unpack non-iterable NoneType报错
根本原因
你之前两次调整都没有命中问题核心,报错的本质原因有两点:
- 传参逻辑完全错误:你虽然写了
if xxx is not None的非空判断,甚至提前缓存了识别结果,但实际调用pyautogui.moveTo()时传入的是图片文件名,而非你提前缓存的坐标对象。这会导致moveTo内部重新执行一次全屏图像识别,你之前做的所有非空校验全部失效——只要这次二次识别因为界面瞬时遮挡、系统资源抢占、卡顿返回None,内部解包坐标时就会直接抛出你看到的TypeError。 - 缺少偶发失败兜底:pyautogui的图像识别本身不是100%稳定,系统长时间运行后内存占用升高、屏幕缩放进程刷新、弹窗临时遮挡都可能导致单次识别失败,你没有重试和异常兜底逻辑,一次识别失败就会导致整个程序崩溃。
你提到的“改完代码能正常跑1天再复现”也完全符合这个逻辑:刚启动程序时系统资源充足,moveTo内部二次识别成功率极高,运行时间久了后台进程变多、资源紧张,二次识别偶发返回None就会触发报错。
稳定修复方案
- 彻底废弃「传图片路径给moveTo/click等交互函数」的写法,所有识别到的坐标结果校验通过后,直接取坐标值传给交互函数,从根源上避免二次识别。拿到
locateOnScreen返回的坐标对象后,用pyautogui.center(坐标对象)即可获取目标中心点的(x,y)元组,直接传给moveTo即可。 - 封装带重试的通用找图函数,单次识别失败后等待短时间重试3-5次,兜住界面瞬时刷新、系统卡顿导致的偶发识别失败。
- 保留嵌套判断逻辑,上一步交互操作完成后等待界面稳定,再执行下一轮找图操作,避免界面还在加载时识别失败。
修复后参考代码
import pyautogui import time import keyboard import random import win32api, win32con def find_image_persist(img_path, confidence=0.8, max_retry=3, retry_interval=0.2): """带重试的稳定找图函数,识别成功返回坐标对象,多次失败返回None""" for _ in range(max_retry): pos = pyautogui.locateOnScreen(img_path, confidence=confidence) if pos is not None: return pos time.sleep(retry_interval) return None def FindContact1(): pyautogui.click(319,25) pyautogui.click(99,161) time.sleep(1) # 识别第一个目标,校验通过后直接使用缓存坐标,不再二次识别 scheduled_pos = find_image_persist('ScheduledBy.png') if scheduled_pos is not None: print('Found Scheduled') pyautogui.moveTo(pyautogui.center(scheduled_pos)) pyautogui.moveRel(245,20) time.sleep(.1) pyautogui.click() time.sleep(2) # 上一步操作完成、界面稳定后再识别下一个目标 email_pos = find_image_persist('Email.png') if email_pos is not None: print("Found Email") pyautogui.moveTo(pyautogui.center(email_pos)) pyautogui.moveRel(0,20) time.sleep(.2) pyautogui.tripleClick() time.sleep(.1) pyautogui.hotkey('ctrl', 'c') time.sleep(.1) pyautogui.click(88,25) time.sleep(2) cced_pos = find_image_persist('Cced.png') if cced_pos is not None: print("Found CCed") pyautogui.moveTo(pyautogui.center(cced_pos)) pyautogui.moveRel(-44,0) time.sleep(.1) pyautogui.click() pyautogui.hotkey('ctrl', 'v')
额外注意事项
如果你的Windows系统开启了125%/150%等非100%屏幕缩放,建议先将缩放调整为100%,避免长时间运行后桌面窗口管理器进程刷新导致识别分辨率错位,进一步降低偶发失败概率。
内容的提问来源于stack exchange,提问作者CDoz
相关产品推荐
相关产品推荐

