我目前正在自动化一个涉及运行 Hapfacs 3.0 的过程,这是一个旨在构建面部图像的 C# 程序。我正在使用 python 打开程序,设置一些参数,然后保存生成的图像。自动化将执行此过程 1000 次。保存过程包括打开文件资源管理器(我在 Windows 7 上),输入文件名,然后保存。
我遇到的一个问题是文件资源管理器偶尔需要一段时间才能打开,这会扰乱自动化,因为程序在文件资源管理器窗口打开之前就开始输入文件名。
我想让程序在开始输入之前等待文件资源管理器打开。因此,我需要能够判断文件资源管理器是否打开。我在这里找到了这个页面:
Python check if a process is running or not
建议使用 psutil 模块:
import psutil
"someProgram" in (p.name() for p in psutil.process_iter())
然而列表
[p.name() for p in psutil.process_iter()]
文件资源管理器打开时与关闭时没有区别,这表明文件资源管理器从未添加到列表中。我仍然可以使用 psutil 检查文件资源管理器是否打开,或者是否有其他方法可以实现我的目标?感谢您的帮助。
请您参考如下方法:
不幸的是,你找不到任何改变的原因是在 Windows 上负责几乎所有文件操作(文件资源管理器、桌面管理等)的“explorer.exe”总是打开的,并且从单个实例运行。我不知道您可以通过 Python 执行此操作的任何方式,但我确实有一个您可以合并的解决方案,即使它并不理想。
使用 PIL,可在此处找到 http://www.pythonware.com/products/pil/ ,您可以抓取屏幕图像并检查特定点的像素颜色,这应该可以满足您当前的需求。如果您需要从屏幕上获取像素颜色,我能想到的用于快速制作模型的最佳工具是 autohotkeys window spy。
希望这会有所帮助,我知道当您必须像这样进行黑客攻击时,有时自动化会是多么烦人,所以如果您有任何其他问题,请告诉我。
编辑: 我一直在思考这样的想法,当文件资源管理器打开时,资源管理器打开的句柄数量将增加相当大的幅度,如果您除了运行自动脚本之外什么都不做,那么行为是相当正常的可预测,但需要您进行一些实验。
这是我的:
import psutil
for proc in psutil.process_iter():
if 'explorer' in proc.name():
print(proc.name() + " handles:" + str(proc.num_handles()))
当我在关闭文件浏览器和打开文件浏览器的情况下运行此命令时,我随机增加了大约 100 个句柄或更多,因此您可以存储之前的数量并轮询当前数量假设您不这样做打开其他任何东西 当句柄增加 X 数量时,您知道文件资源管理器已打开并可以开始输入,然后在它下降到 X 数量附近后您知道它已关闭并重新保存新的句柄数量并等待您的 X再次增加。
虽然这不是一个完美的解决方案,但您应该能够让它很好地满足您的需求。
编辑2:
这对我有用,您可能需要更改 usualIncrease 数量,因为它可能会增加或减少创建的句柄数量。
import psutil
import time
handlesPrevious = 0
usualIncrease = 100
for proc in psutil.process_iter():
if 'explorer' in proc.name():
handlesPrevious = proc.num_handles()
while 1:
time.sleep(5)
for proc in psutil.process_iter():
if 'explorer' in proc.name():
handlesCurrent = proc.num_handles()
if (handlesPrevious + usualIncrease) <= handlesCurrent:
print("File explorer open! - handles:" + str(handlesCurrent) + " previous handles:" + str(handlesPrevious))
handlesPrevious = handlesCurrent
elif (handlesPrevious - usualIncrease) > handlesCurrent:
print("File explorer not open! - handles:" + str(handlesCurrent))
handlesPrevious = handlesCurrent
