簡體   English   中英

如何判斷程序是否打開

[英]How To Tell If A Program Is Open

我目前正在自動化一個涉及運行Hapfacs 3.0的過程,Hapfacs 3.0是一個旨在構造面部圖像的C#程序。 我正在使用python打開程序,設置一些參數,然后保存生成的圖像。 自動化將執行此過程數千次。 保存過程包括打開文件資源管理器(我在Windows 7上),輸入文件名,然后保存。

我遇到的一個問題是,文件資源管理器有時需要花一些時間才能打開,這使自動化工作陷入混亂,因為程序在“文件資源管理器”窗口打開之前就開始輸入文件名。

我希望程序在開始輸入之前等待文件資源管理器打開。 因此,我需要能夠判斷File Explorer是否打開。 我在這里找到此頁面:

Python檢查進程是否正在運行

建議使用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做到這一點的任何方法,但是我有一個可以合並的解決方案,即使它不是理想的。

使用http://www.pythonware.com/products/pil/上的 PIL,您可以抓取屏幕圖像並檢查特定點的像素顏色,這應該允許您使用當前的功能。 如果您需要從屏幕上獲取像素顏色,那么我能想到的用於快速建模的最佳工具是autohotkeys window spy。

希望這會有所幫助,我知道有時您需要像這樣的hack時,有時自動化會很煩人,所以如果您還有其他問題,請告訴我。

編輯 :我在搞亂的想法是, 當打開文件資源管理器時,由資源管理器打開的句柄數量將以適當的幅度增加 ,並且,如果您不執行任何操作(運行自動腳本除外),則該行為是可以預見的,但需要在您的終端上進行少量實驗。

這就是我所擁有的:

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數量后,您知道文件瀏覽器已關閉,您將重新保存新的句柄數,然后等待X再次增加。

雖然這不是一個完美的解決方案,但您應該能夠使其完全滿足您的需求。

編輯2

這對我有用,您可能需要更改通常的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

編輯:我覺得這是一個XY問題( http://xyproblem.info/ ),作者正在啟動文件資源管理器並通過鍵盤選擇Hapfacs文件,因為他們不知道如何使用命令行參數,“對於每個文件,啟動Hapfacs.exe $file “。


也許您應該通過Python調用Hapfacs,而不是嘗試自動執行File Explorer?

內置subprocess.Popen靈活用於管道。

如果要調用程序並等待其終止,則subprocess.callplumbum庫更易於使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM