使用Pylons和WMI时出现“释放IUnknown时发生Win32异常...”错误
我正在用Pylons和WMI模块来监控几台机器的基本系统信息。对于POSIX系统(比如Linux)来说,这一切都很简单,但在Windows上就没那么容易了。
我尝试向Pylons服务器请求当前的CPU信息,但效果不太好,特别是使用WMI模块时。最开始我简单地做了这样一个请求:
c = wmi.WMI()
for cpu in c.Win32_Processor():
value = cpu.LoadPercentage
但是,当我通过Pylons访问这个模块时,出现了错误(GET http://ip:port/cpu):
raise x_wmi_uninitialised_thread ("WMI returned a syntax error: you're probably running inside a thread without first calling pythoncom.CoInitialize[Ex]")
x_wmi_uninitialised_thread: <x_wmi: WMI returned a syntax error: you're probably running inside a thread without first calling pythoncom.CoInitialize[Ex] (no underlying exception)>
我查看了这个链接,根据“CoInitialize & CoUninitialize”这个主题的示例调整了代码,这样代码可以运行了,但它还是不断抛出错误信息:"Win32 exception occurred releasing IUnknown at..."
然后我又看了这个链接和后续的帖子,试着按照上面的内容去做,但发现pythoncom._GetInterfaceCount()
的值总是20。
我猜这可能和Pylons创建工作线程之类的有关,但我有点迷茫,希望能得到一些建议。
提前谢谢你们,
安德斯
补充:如果你在做类似的事情,别再用WMI模块了,直接使用这个链接,这样就不用担心线程的问题了。
2 个回答
在你的“import sys”这一行后面,加上“sys.coinit_flags = 0”,然后再在“import pythoncom”这一行之前放上去。这样做对我有效,虽然我也不知道为什么。
听起来Windows对你在可能是临时工作线程上进行这种操作的方式不太满意,就像你提到的那样。
如果真是这样,而且你又无法让事情正常运作,那么一个可能的解决办法就是稍微调整一下你的应用程序,让它始终有一个服务线程在运行。这样你就可以随时查询所需的信息,而不是每次都要设置好再去请求。其实,这个服务不一定非得是线程,也可以是一个工具类的实例,你可以在应用启动时就创建好,并加上锁来防止同时访问。