Python 如何判断程序是否已打开
我目前正在自动化一个过程,其中包括运行Hapfacs 3.0,这是一个旨在构建面部图像的C#程序。我正在使用python打开程序,设置一些参数,然后保存生成的图像。自动化将完成此过程1000次。保存过程包括打开文件资源管理器(我在Windows 7上),键入文件名,然后保存 我遇到的一个问题是,文件资源管理器偶尔需要一段时间才能打开,这会影响自动化,因为程序在文件资源管理器窗口打开之前就开始键入文件名 我想让程序等待文件资源管理器打开后再开始键入。因此,我需要能够判断文件资源管理器是否打开。我在这里找到了这个页面: 建议使用psutil模块:Python 如何判断程序是否已打开,python,automation,psutil,Python,Automation,Psutil,我目前正在自动化一个过程,其中包括运行Hapfacs 3.0,这是一个旨在构建面部图像的C#程序。我正在使用python打开程序,设置一些参数,然后保存生成的图像。自动化将完成此过程1000次。保存过程包括打开文件资源管理器(我在Windows 7上),键入文件名,然后保存 我遇到的一个问题是,文件资源管理器偶尔需要一段时间才能打开,这会影响自动化,因为程序在文件资源管理器窗口打开之前就开始键入文件名 我想让程序等待文件资源管理器打开后再开始键入。因此,我需要能够判断文件资源管理器是否打开。我在
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,您可以抓取屏幕的图像,并检查特定点的像素颜色,这应该允许您当前所追求的。如果你需要从屏幕上抓取像素颜色,我能想到的最好的快速模型工具就是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再次增加
虽然这不是一个完美的解决方案,但您应该能够让它很好地满足您的需求
Edit2:
这对我来说是可行的,您可能需要更改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
导入psutil
导入时间
handlesPrevious=0
usualIncrease=100
对于psutil.process_iter()中的进程:
如果进程名()中的“资源管理器”:
handlesPrevious=proc.num_handles()
而1:
时间。睡眠(5)
对于psutil.process_iter()中的进程:
如果进程名()中的“资源管理器”:
handlesCurrent=proc.num_handles()
如果(handlesPrevious+usualIncrease)handlesCurrent:
打印(“文件资源管理器未打开!-句柄:“+str(handlesCurrent))
handlesPrevious=handlesCurrent
不幸的是,您找不到任何变化的原因是,在windows“explorer.exe”上,它负责几乎所有的文件操作(文件资源管理器、桌面管理等…)始终处于打开状态,并从单个实例运行。我不知道有什么方法可以从python实现这一点,但我确实有一个可以合并的解决方案,即使它并不理想
使用这里的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再次增加
虽然这不是一个完美的解决方案,但您应该能够让它很好地满足您的需求
Edit2:
这对我来说是可行的,您可能需要更改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
导入psutil
导入时间
handlesPrevious=0
usualIncrease=100
对于psutil.process_iter()中的进程:
如果进程名()中的“资源管理器”:
handlesPrevious=proc.num_handles()
而1:
时间。睡眠(5)
对于psutil.process_iter()中的进程:
如果进程名()中的“资源管理器”:
handlesCurrent=proc.num_handles()
if(handlesPrevious)