如何让multiprocessing正常运行并获取进程结果?解决索引报错
解决multiprocessing进程结果获取的报错问题
报错根源解析
你碰到的TypeError: 'Process' object does not support indexing其实是多进程入门的常见坑:当你创建并启动multiprocessing.Process实例后,变量resourceBlankLightTemp指向的是进程对象本身,而不是locateOnScreen('calc7key.png')的返回结果。Process只是负责启动子进程执行任务,不会自动把任务结果回传给主进程,所以你直接用[1]去索引肯定会报错。
针对你的场景的解决方案
你的需求是在子进程中调用locateOnScreen获取屏幕坐标,再把结果拿到主进程处理,下面两种方法都能完美解决这个问题:
方法1:用multiprocessing.Queue做进程间通信
Queue是多进程安全的消息队列,子进程可以把结果存入队列,主进程再从队列里取出:
import multiprocessing import pyautogui def fetch_coords(queue): # 子进程中执行图像定位 coords = pyautogui.locateOnScreen('calc7key.png') # 把结果放入队列 queue.put(coords) if __name__ == '__main__': # 创建用于传递结果的队列 result_queue = multiprocessing.Queue() # 初始化并启动子进程 proc = multiprocessing.Process(target=fetch_coords, args=(result_queue,)) proc.start() # 等待子进程完成任务 proc.join() # 从队列中取出定位结果 resourceBlankLightTemp = result_queue.get() # 现在可以正常处理结果了 if resourceBlankLightTemp: checkNumber1 = resourceBlankLightTemp[1] print(f"目标的top坐标:{checkNumber1}") else: print("屏幕上未找到calc7key.png对应的图像")
方法2:用multiprocessing.Pool简化结果获取
如果只是单任务的多进程执行,用Pool的同步方法可以更简洁地拿到返回值,省去手动管理队列的麻烦:
import multiprocessing import pyautogui def fetch_coords(): return pyautogui.locateOnScreen('calc7key.png') if __name__ == '__main__': # 创建单进程的进程池 with multiprocessing.Pool(processes=1) as pool: # 同步执行任务并获取结果 resourceBlankLightTemp = pool.apply(fetch_coords) # 处理结果 if resourceBlankLightTemp: checkNumber1 = resourceBlankLightTemp[1] print(f"目标的top坐标:{checkNumber1}") else: print("屏幕上未找到calc7key.png对应的图像")
额外注意点
- 务必把主进程的逻辑放在
if __name__ == '__main__':代码块里,这是Windows系统下多进程正常运行的必要条件,能避免子进程重复执行主模块的代码。 - 记得先判断
resourceBlankLightTemp是否为None,因为locateOnScreen在找不到图像时会返回None,直接索引会触发新的报错。 - 如果后续需要同时运行多个定位任务,Pool的
map/imap方法会更高效;要是需要异步处理结果,apply_async配合回调函数也是不错的选择。
内容的提问来源于stack exchange,提问作者Irutar
相关产品推荐
相关产品推荐

