win32pdh.EnumObjectItems

2024-10-03 15:31:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Windows7中运行Python2.7,并安装了pywin32-216-win32-py2.7。我正在运行以下代码,它在一台计算机上运行良好,但在另一台计算机上输出一个错误(Win7、Py2.7、同一个pywin库)。在

错误消息:

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!'

Tags: instancesnameinimportnoneobjectprocesspid
1条回答
网友
1楼 · 发布于 2024-10-03 15:31:27

当进程性能计数器被禁用时,我也遇到了同样的问题——很明显,这种情况可能会发生。有关于如何重新启用计数器的说明here。如果无法在计算机上安装软件,可以运行regedit并搜索名为“禁用性能计数器”的键并将其删除。在

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

相关问题 更多 >