2016-05-16 23 views
0

一起工作,所以我一直在试图找到一种方法来访问任务管理器。我已经尝试了一些方法,包括wmi模块和Windows任务列表,但都不适合我的需要。 wmi速度太慢,当我多次同时访问使用多处理的任务时,tasklist变得太慢。所以我发现这个脚本工作得很好,但我不能让它与线程一起工作。为什么这个脚本不能与线程python

import win32com.client 
strComputer = "." 
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") 
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2") 
colItems = objSWbemServices.ExecQuery("Select * from Win32_Process") 
for objItem in colItems: 
    print "Name: ", objItem.Name 
    print "File location: ", objItem.ExecutablePath 

这是错误:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "C:\Python27\lib\threading.py", line 763, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "C:\python practice\stuff.py", line 5, in idk 
    objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator") 
    File "C:\Python27\lib\site-packages\pypiwin32-219-py2.7-win32.egg\win32com\cli 
ent\__init__.py", line 95, in Dispatch 
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,c 
lsctx) 
    File "C:\Python27\lib\site-packages\pypiwin32-219-py2.7-win32.egg\win32com\cli 
ent\dynamic.py", line 114, in _GetGoodDispatchAndUserName 
    return (_GetGoodDispatch(IDispatch, clsctx), userName) 
    File "C:\Python27\lib\site-packages\pypiwin32-219-py2.7-win32.egg\win32com\cli 
ent\dynamic.py", line 91, in _GetGoodDispatch 
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.II 
D_IDispatch) 
com_error: (-2147221008, 'CoInitialize has not been called.', None, None) 
+0

的可能的复制[使用win32com与多线程](http://stackoverflow.com/questi附件/ 26764978 /使用-win32com与 - 多线程) –

回答

3

你需要调用CoInitialize()才能使用win32com.client

import pythoncom 
import win32com.client as client 

pythoncom.CoInitialize() 

strComputer = "." 
objWMIService = client.Dispatch("WbemScripting.SWbemLocator") 
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2") 
colItems = objSWbemServices.ExecQuery("Select * from Win32_Process") 

for objItem in colItems: 
    print "Name: ", objItem.Name 
    print "File location: ", objItem.ExecutablePath 

欲了解更多的背景信息,请参阅using win32com with multithreading

相关问题