2016-05-16 77 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

相關問題