You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pywinauto调用wait_cpu_usage_lower时OpenProcess报参数错误如何解决

问题根因

这个(87, 'OpenProcess', '参数不正确')错误本质是调用wait_cpu_usage_lower时,Application实例绑定的进程PID已经失效,Windows找不到对应PID的进程,所以API调用返回参数错误。触发的原因有两个:

  1. explorer默认是单实例运行,调用explorer.exe /select,xxx时,系统通常不会启动新的explorer进程,而是向已有的explorer主进程发送指令开新窗口,你启动的临时explorer进程会在指令发送后立刻退出,这时候按路径匹配到的如果是这个刚退出的临时进程,后续操作自然会报错
  2. 你用了两个独立的Application实例分别执行start和connect,没有绑定启动时的正确PID,按path=explorer.exe匹配时很容易命中系统中已经存在的其他explorer进程(比如桌面主进程),甚至是还没完成初始化的过渡进程,等你调用CPU等待方法时进程状态已经异常
解决方案
  • 不要拆分start和connect的实例,也不要单纯按路径匹配explorer进程,优先通过窗口属性匹配进程,保证拿到的PID对应实际承载目标窗口的有效进程
  • 先等待目标窗口完全创建成功,再执行CPU使用率等待逻辑,避免匹配到未就绪的进程
  • 对该类偶发的PID失效错误增加重试逻辑,适配explorer的特殊进程机制

修复后代码示例

import time
import pywintypes

command = 'explorer.exe'
Timings.slow()

max_retry = 3
for retry in range(max_retry):
    try:
        Application().start(f'{command} /select,{item}')
        # 等待目标窗口出现后再关联进程,避免匹配到无效PID
        app = Application(backend='uia').connect(title_re=f'.*{base_name}.*', timeout=30)
        # 确认窗口可见后再等待CPU空闲
        app.wait_for('visible', timeout=10)
        app.wait_cpu_usage_lower(threshold=0.5, timeout=60, usage_interval=1.0)
        break
    except pywintypes.error as e:
        if e.winerror == 87 and "OpenProcess" in str(e) and retry < max_retry - 1:
            time.sleep(2)
            continue
        raise
补充说明

你之前添加title_re匹配仍失败的原因是报错时窗口还没有渲染完成,connect的超时时间内窗口未出现,或者刚好匹配到了即将退出的临时进程,增加重试和窗口可见性校验后就能覆盖这类偶发场景。

内容的提问来源于stack exchange,提问作者noname7619

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:39:05