Hi All, I did a lot of digging into the code in the module, win32pdhutil, and decided to create some custom methods.
added to : import win32pdhutil def ShowAllProcessesAsList(): object = find_pdh_counter_localized_name("Process") items, instances = win32pdh.EnumObjectItems(None,None,object,win32pdh.PERF_DETAIL_WIZARD) # Need to track multiple instances of the same name. instance_dict = {} all_process_dict = {} for instance in instances: try: instance_dict[instance] = instance_dict[instance] + 1 except KeyError: instance_dict[instance] = 0 # Bit of a hack to get useful info. items = [find_pdh_counter_localized_name("ID Process")] + items[: 5] # print items # print "Process Name", string.join(items,",") all_process_dict['Headings'] = items # add headings to dict for instance, max_instances in instance_dict.items(): for inum in xrange(max_instances+1): hq = win32pdh.OpenQuery() hcs = [] row = [] for item in items: path = win32pdh.MakeCounterPath( (None,object,instance,None, inum, item) ) hcs.append(win32pdh.AddCounter(hq, path)) win32pdh.CollectQueryData(hq) # as per http://support.microsoft.com/default.aspx?scid=kb;EN-US;q262938, some "%" based # counters need two collections time.sleep(0.01) win32pdh.CollectQueryData(hq) # print "%-15s\t" % (instance[:15]), row.append(instance[:15]) for hc in hcs: type, val = win32pdh.GetFormattedCounterValue(hc, win32pdh.PDH_FMT_LONG) # print "item : %5d" % (val), row.append(val) win32pdh.RemoveCounter(hc) # print # print ' row = ', instance ,row all_process_dict[instance] = row # add current row to dict win32pdh.CloseQuery(hq) return all_process_dict def ShowSingleProcessAsList(sProcessName): object = find_pdh_counter_localized_name("Process") items, instances = win32pdh.EnumObjectItems(None,None,object,win32pdh.PERF_DETAIL_WIZARD) # Need to track multiple instances of the same name. instance_dict = {} all_process_dict = {} for instance in instances: try: instance_dict[instance] = instance_dict[instance] + 1 except KeyError: instance_dict[instance] = 0 # Bit of a hack to get useful info. items = [find_pdh_counter_localized_name("ID Process")] + items[: 5] # print items # print "Process Name", string.join(items,",") # all_process_dict['Headings'] = items # add headings to dict # print 'instance dict = ', instance_dict # print if sProcessName in instance_dict: instance = sProcessName max_instances = instance_dict[sProcessName] # print sProcessName, ' max_instances = ', max_instances for inum in xrange(max_instances+1): hq = win32pdh.OpenQuery() hcs = [] row = [] for item in items: path = win32pdh.MakeCounterPath( (None,object,instance,None, inum, item) ) hcs.append(win32pdh.AddCounter(hq, path)) try: win32pdh.CollectQueryData(hq) except: all_process_dict[sProcessName] = [0,0,0,0,0,0,0] # process not found - set to all zeros break # as per http://support.microsoft.com/default.aspx?scid=kb;EN-US;q262938, some "%" based # counters need two collections time.sleep(0.01) win32pdh.CollectQueryData(hq) # print "%-15s\t" % (instance[:15]), row.append(instance[:15]) for hc in hcs: type, val = win32pdh.GetFormattedCounterValue(hc, win32pdh.PDH_FMT_LONG) # print "item : %5d" % (val), row.append(val) win32pdh.RemoveCounter(hc) # print # print ' row = ', instance ,row all_process_dict[instance] = row # add current row to dict win32pdh.CloseQuery(hq) else: all_process_dict[sProcessName] = [0,0,0,0,0,0,0] # process not found - set to all zeros return all_process_dict ============================= Demo : import win32pdhutil # with customized methods in win32pdhutil (above) ################################################################### # GetMemoryStats # ################################################################### def GetMemoryStats(sProcessName, iPauseTime): Memory_Dict = {} ## Headings ['ProcessName', '% Processor Time', '% User Time', '% Privileged Time', 'Virtual Bytes Peak', 'Virtual Bytes'] ##machine process = {'firefox': ['firefox', 2364, 0, 0, 0, 242847744, 211558400]} loop_counter = 0 print('\n\n** Starting Free Memory Sampler **\n\n') print('Process : %s\n Delay : %d seconds\n\n') % (sProcessName, iPauseTime) print('\n\nPress : Ctrl-C to stop and output stats...\n\n') try: while 1: print('Sample : %d') % loop_counter row = [] machine_process = win32pdhutil2.ShowSingleProcessAsList(sProcessName) # print 'machine process = ', machine_process row.append(machine_process[sProcessName] [5]) # Virtual Bytes Peak row.append(machine_process[sProcessName] [6]) # Virtual Bytes Memory_Dict[loop_counter] = row # add values to the dictionary loop_counter += 1 time.sleep(iPauseTime) except KeyboardInterrupt: # Ctrl-C encountered print "End of Sample...\n\n" return Memory_Dict ################################################################### ############# M A I N ########################### ################################################################### def Main(): iPause_time = 5 # pause time - seconds sProcessName = 'firefox' # Process to watch sReportFileName = 'MemoryStats.csv' # output filename Memory_Dict = GetMemoryStats(sProcessName, iPause_time) outfile = open(sReportFileName,"w") # send output to a file outfile.write('SampleTime, VirtualBytesMax, VirtualBytes\n') for current_stat in Memory_Dict: line = ('%s,%d,%d\n') % (current_stat, Memory_Dict[current_stat] [0],Memory_Dict[current_stat][1] ) outfile.write(line) outfile.close() # close output file if __name__ == "__main__": Main() ------------------------- I have found that the process that you want to want to monitor needs to be started before this script is started. The script will handle when the process disappears and set the stats to zeros. Enjoy! Steve -- http://mail.python.org/mailman/listinfo/python-list