2012-01-19 38 views
2

我在Windows 7中运行Python 2.7,安装了pywin32-216-win32-py2.7。我正在运行以下代码,并且它在一台计算机上运行良好,但在另一台计算机上输出错误(包括Win7,Py2.7,相同的pywin库)。win32pdh.EnumObjectItems调用错误

错误消息:

File "C:\Energy\Support Sheets\Kill Excel.py", line 9, in GetProcessID items, instances = win32pdh.EnumObjectItems(None, None, object, win32pdh.PERF_DETAIL_WIZARD) error: (-1073738824, 'EnumObjectItems for buffer size', 'The specified object was not found on the computer.')

全码:

import win32api, win32con 
import win32pdh 
import os 
import signal 
import time 

def GetProcessID(name) : 
    object = "Process" 
    items, instances = win32pdh.EnumObjectItems(None, None, object, win32pdh.PERF_DETAIL_WIZARD) 
    val = None 
    if name in instances : 
     hq = win32pdh.OpenQuery() 
     hcs = [ ] 
     item = "ID Process" 
     path = win32pdh.MakeCounterPath((None, object, name, None, 0, item)) 
     hcs.append(win32pdh.AddCounter(hq, path)) 
     win32pdh.CollectQueryData(hq) 
     time.sleep(0.01) 
     win32pdh.CollectQueryData(hq) 

     for hc in hcs: 
      type, val = win32pdh.GetFormattedCounterValue(hc, win32pdh.PDH_FMT_LONG) 
      win32pdh.RemoveCounter(hc) 
     win32pdh.CloseQuery(hq) 
     return val 

def Kill_Process_pid(pid): 
    handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pid) #get process handle 
    win32api.TerminateProcess(handle, -1) #kill by handle 
    win32api.CloseHandle(handle)  #close api 

def Kill_Process(name): 
    pid = GetProcessID(name) 
    if pid: 
     try: 
      Kill_Process_pid(pid) 
      return True 
     except: 
      pass 
    else: 
     return False 

# MAIN FUNCTION 
print 'Killing Excel instances...', 
while Kill_Process('EXCEL'): 
    time.sleep(0.2) 
print 'Done!' 
+0

是您的语言环境英语吗?如果不是,则对象名称可能拼写不同。 – Frank

回答

1

我有同样的问题时,处理性能计数器被禁用 - 显然这可能只是发生。有关于如何重新启用计数器的说明here。如果您无法在机器上安装软件,则可以运行regedit并搜索名为“禁用性能计数器”的密钥并将其删除。

之后,您可能需要以管理员身份在cmd shell上运行“lodctr/R”以在性能计数器工作之前重新加载性能计数器。