OpenProcess 在 wait_cpu_usage_lower 中失败
Posted
技术标签:
【中文标题】OpenProcess 在 wait_cpu_usage_lower 中失败【英文标题】:OpenProcess fails in wait_cpu_usage_lower 【发布时间】:2021-11-19 08:49:50 【问题描述】:我们正在尝试在特定路径打开资源管理器窗口,然后等待准备就绪。客户端是通过rpyc
操作的,因此堆栈跟踪很奇怪。这有时会发生,但仅在同一个测试中。这个函数 (fileman_item_properties
) 用于打开文件属性窗口,它在许多不同的地方都可以正常工作。
command = f'explorer.exe'
Timings.slow()
try:
Application().start(f'command /select,item')
app = Application(backend='uia').connect(path=command)
app.wait_cpu_usage_lower(threshold=0.5, timeout=60, usage_interval=1.0)
4 Traceback (most recent call last):
265 File "/home/serj/work/mpksoft/te/tests/test_vss_simple.py", line 540, in test_restore_root_share_dirs
266 fileman_restore_item(client, self._share_path, version)
267 File "/home/serj/work/mpksoft/te/lib/host/coreui.py", line 377, in fileman_restore_item
268 host_plugin_load(conn, 'coreui').fileman_restore_item(path, version)
269 File "/home/serj/work/.virtualenvs/te36/lib/python3.6/site-packages/rpyc/core/netref.py", line 240, in __call__
270 return syncreq(_self, consts.HANDLE_CALL, args, kwargs)
271 File "/home/serj/work/.virtualenvs/te36/lib/python3.6/site-packages/rpyc/core/netref.py", line 63, in syncreq
272 return conn.sync_request(handler, proxy, *args)
273 File "/home/serj/work/.virtualenvs/te36/lib/python3.6/site-packages/rpyc/core/protocol.py", line 473, in sync_request
274 return self.async_request(handler, *args, timeout=timeout).value
275 File "/home/serj/work/.virtualenvs/te36/lib/python3.6/site-packages/rpyc/core/async_.py", line 102, in value
276 raise self._obj
277 rpyc.core.vinegar/pywintypes._get_exception_class.<locals>.Derived: (87, 'OpenProcess', 'The parameter is incorrect.')
278
279 ========= Remote Traceback (1) =========
280 Traceback (most recent call last):
281 File "C:\Program Files\Python38\lib\site-packages\rpyc\core\protocol.py", line 320, in _dispatch_request
282 res = self._HANDLERS[handler](self, *args)
283 File "C:\Program Files\Python38\lib\site-packages\rpyc\core\protocol.py", line 593, in _handle_call
284 return obj(*args, **dict(kwargs))
285 File ".\windows\coreui.py", line 1285, in fileman_restore_item
286 fileman_item_properties(path)
287 File ".\windows\coreui.py", line 422, in fileman_item_properties
288 app.wait_cpu_usage_lower(threshold=0.5, timeout=60, usage_interval=1.0)
289 File "C:\Program Files\Python38\lib\site-packages\pywinauto\application.py", line 1135, in wait_cpu_usage_lower
290 while self.cpu_usage(usage_interval) > threshold:
291 File "C:\Program Files\Python38\lib\site-packages\pywinauto\application.py", line 1110, in cpu_usage
292 h_process = win32api.OpenProcess(win32con.MAXIMUM_ALLOWED, 0, self.process)
293 pywintypes.error: (87, 'OpenProcess', 'The parameter is incorrect.')
UPD
很遗憾,下面的代码没有解决问题。未就绪的进程不知何故通过connect
超时。
Application().start(f'command /select,item')
app = Application(backend='uia').connect(path=command, title_re=f'.*base_name.*', timeout=60)
app.wait_cpu_usage_lower(threshold=0.5, timeout=60, usage_interval=1.0)
顺便说一句,在出错时资源管理器窗口尚未显示。
【问题讨论】:
【参考方案1】:有时explorer.exe
没有足够的时间开始。您需要为connect()
方法使用显式超时:
app = Application(backend='uia').connect(path=command, timeout=10)
另一种可能的情况是已经存在的explorer.exe
实例已经在运行并且通过可执行文件名连接是间歇性的。那么请使用按标题连接!
app = Application(backend='uia').connect(title="Properties", timeout=10)
Readme.md 中的标准示例也可能有帮助:https://github.com/pywinauto/pywinauto/tree/master#ms-ui-automation-example
【讨论】:
那么这个错误意味着app
进程还没有准备好?
进程未准备好或explorer.exe
可能会产生多个进程,包括在执行 pywinauto 方法时可能退出的临时启动器。请尽可能依赖窗口标题。否则你现在不知道你连接到哪个进程。
更新了问题。非常感谢!
查看源代码可以发现path
和title_re
参数被应用为OR。在文档中值得注意,因为 AND 逻辑似乎更常见。
我想在下一个主要版本中将其更改为 AND 逻辑。虽然我不能保证这个版本的确切日期。我们有大量积压工作,没有全职员工。以上是关于OpenProcess 在 wait_cpu_usage_lower 中失败的主要内容,如果未能解决你的问题,请参考以下文章
VC++ 2008,OpenProcess 总是返回错误 5(拒绝访问)