如何判断程序是否打开

时间:2018-08-20 23:01:50

标签: python automation psutil

我目前正在自动化一个涉及运行Hapfacs 3.0的过程,该过程是旨在构造面部图像的C#程序。我正在使用python打开程序,设置一些参数,然后保存生成的图像。自动化将执行此过程数千次。保存过程包括打开File Explorer(我在Windows 7上),输入文件名,然后保存。

我遇到的一个问题是,文件资源管理器有时需要花一些时间才能打开,这与自动化过程有关,因为该程序在打开“文件资源管理器”窗口之前就开始输入文件名。

我希望程序在开始输入之前等待文件资源管理器打开。因此,我需要能够判断File Explorer是否打开。我在这里找到此页面:

Python check if a process is running or not

建议使用psutil模块:

randint()

但是列表

import psutil    
"someProgram" in (p.name() for p in psutil.process_iter())
如果打开文件资源管理器,则

与关闭文件资源时没有什么不同,这表明文件资源管理器从未添加到列表中。我是否仍然可以检查psutil是否打开了文件资源管理器,或者是否有其他方法可以实现我的目标?感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

不幸的是,您找不到任何更改的原因是,在Windows上负责几乎所有文件操作(文件浏览器,桌面管理等)的“ explorer.exe”始终处于打开状态,并且从单个实例运行。我不知道您可以从python做到这一点,但是我有一个可以合并的解决方案,即使它并不理想。

使用http://www.pythonware.com/products/pil/处的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

这对我有用,您可能需要更改通常的Increase数量,因为它可能是创建的手柄的数量更大或更小。

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

答案 1 :(得分:-1)

编辑:我认为这是一个XY问题(http://xyproblem.info/),作者正在启动文件资源管理器并通过键盘选择Hapfacs文件,因为他们不知道如何使用命令行参数,“对于每个文件,启动Hapfacs.exe $file”。


也许您应该通过Python调用Hapfacs,而不是尝试自动化File Explorer?

内置subprocess.Popen可灵活地用于管道。

如果您要调用程序并等待其终止,则

subprocess.callplumbum库更易于使用。