1

これが私がここで尋ねた最初の質問だと思います通常、私が必要とするすべての答えを見つけます(事前に感謝します)

私の問題は、スレッドでプロセスを監視し、後で使用するために結果をcsvファイルに出力するPythonプログラムを作成したことです。このコードはうまく機能しています。カウンターにはwin32pdhutilを使用し、CPU%timeにはWMI、Win32_PerfRawData_PerfProc_Processを使用しています。WPFアプリケーションを監視し、特にユーザーオブジェクトとGDIオブジェクトを監視するように求められました。

これは私が問題を抱えているところです、それは私がこれらの2つのカウンターでメトリックを収集するためのPythonサポートを見つけることができないように見えるということです。これらの2つのカウンターは、タスクマネージャーで簡単に利用できます。これらの2つのカウンターに関する情報がほとんどないのは奇妙なことです。私は特にメモリリークがあるかどうかを確認するためにこれらを収集することを検討しています。すでにインストールされているPython以外のものをシステムにインストールしたくありません。解決策を見つけるのに役立つ情報を覗いてください。

私はPython3.3.1を使用しています。これは、Windowsプラットフォーム(主にwin7とwin8)で実行されます。これは、データを収集するために使用しているコードです。

def gatherIt(self,whoIt,whatIt,type,wiggle,process_info2):
    #this is the data gathering function thing
    data=0.0
    data1="wobble"
    if type=="counter":
        #gather data according to the attibutes
        try:
            data = win32pdhutil.FindPerformanceAttributesByName(whoIt, counter=whatIt)
        except:
            #a problem occoured with process not being there not being there....
            data1="N/A"

    elif type=="cpu":
       try:
            process_info={}#used in the gather CPU bassed on service
            for x in range(2):
                for procP in wiggle.Win32_PerfRawData_PerfProc_Process(name=whoIt):
                    n1 = int(procP.PercentProcessorTime)
                    d1 = int(procP.Timestamp_Sys100NS)
                    #need to get the process id to change per cpu look...
                    n0, d0 = process_info.get (whoIt, (0, 0))     
                    try:
                        percent_processor_time = (float (n1 - n0) / float (d1 - d0)) *100.0
                        #print whoIt, percent_processor_time
                    except ZeroDivisionError:
                        percent_processor_time = 0.0
                    # pass back the n0 and d0
                    process_info[whoIt] = (n1, d1)
                #end for loop (this should take into account multiple cpu's)
            # end for range to allow for a current cpu time rather that cpu percent over sampleint
            if percent_processor_time==0.0:
                data=0.0
            else:
                data=percent_processor_time
        except:
            data1="N/A"

    else:
        #we have done something wrong so data =0
        data1="N/A"
    #endif
    if data == "[]":
        data=0.0
        data1="N/A"
    if data == "" :
        data=0.0
        data1="N/A"
    if data == " ":
        data=0.0
        data1="N/A"
    if data1!="wobble" and data==0.0:
        #we have not got the result we were expecting so add a n/a
        data=data1
    return data

乾杯

誰かがそれを実行しようとした場合、正しいCPUタイミングの問題のために編集されました:D

4

2 に答える 2

3

それで、長い検索の後、私は必要な情報を得る何かを一緒にマッシュアップすることができました。

import time
from ctypes import *
from ctypes.wintypes import *
import win32pdh

# with help from here http://coding.derkeiler.com/Archive/Python/comp.lang.python/2007-10/msg00717.html
# the following has been mashed together to get the info needed

def GetProcessID(name):
    object = "Process"
    items, instances = win32pdh.EnumObjectItems(None, None, object, win32pdh.PERF_DETAIL_WIZARD)
    val = None
    if name in instances :
        tenQuery = win32pdh.OpenQuery()
        tenarray = [ ]
        item = "ID Process"
        path = win32pdh.MakeCounterPath( ( None, object, name, None, 0, item ) )
        tenarray.append( win32pdh.AddCounter( tenQuery, path ) )
        win32pdh.CollectQueryData( tenQuery )
        time.sleep( 0.01 )
        win32pdh.CollectQueryData( tenQuery )
        for tencounter in tenarray:
            type, val = win32pdh.GetFormattedCounterValue( tencounter, win32pdh.PDH_FMT_LONG )
            win32pdh.RemoveCounter( tencounter )
        win32pdh.CloseQuery( tenQuery )
    return val

processIDs = GetProcessID('OUTLOOK') # Remember this is case sensitive
PQI = 0x400
#open a handle on to the process so that we can query it
OpenProcessHandle = windll.kernel32.OpenProcess(PQI, 0, processIDs)
# OK so now we have opened the process now we want to query it
GR_GDIOBJECTS, GR_USEROBJECTS = 0, 1
print(windll.user32.GetGuiResources(OpenProcessHandle, GR_GDIOBJECTS))
print(windll.user32.GetGuiResources(OpenProcessHandle, GR_USEROBJECTS))
#so we have what we want we now close the process handle
windll.kernel32.CloseHandle(OpenProcessHandle)

それが役立つことを願っています

于 2013-08-13T11:12:47.833 に答える
2

GDIカウントの場合、より単純でクリーンな監視スクリプトは次のようになります。

import time, psutil
from ctypes import *

def getPID(processName):
    for proc in psutil.process_iter():
        try:
            if processName.lower() in proc.name().lower():
                return proc.pid
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    return None;

def getGDIcount(PID):
    PH = windll.kernel32.OpenProcess(0x400, 0, PID)
    GDIcount = windll.user32.GetGuiResources(PH, 0)
    windll.kernel32.CloseHandle(PH)
    return GDIcount

PID = getPID('Outlook')

while True:
    GDIcount = getGDIcount(PID)
    print(f"{time.ctime()}, {GDIcount}")
    time.sleep(1)
于 2019-07-10T02:26:23.067 に答える