我将Pylons与WMI模块结合使用,可以对几台机器进行基本的系统监控,对于基于POSIX的系统,一切都很简单 - 对于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)>
查看http://timgolden.me.uk/python/wmi/tutorial.html,我将代码相应地包装在“CoInitialize&amp; CoUninitialize”主题下的示例中,这使代码工作,但它不断抛出"Win32 exception occurred releasing IUnknown at..."
然后查看http://mail.python.org/pipermail/python-win32/2007-August/006237.html和后续帖子,尝试遵循 - 但pythoncom._GetInterfaceCount()
始终为20。
我猜这是与Pylons产生的工作线程和垃圾有关,但是我有点迷失在这里,建议会很好。
提前致谢,
的Anders
编辑:如果你正在做类似的事情,不要打扰WMI模块,只需使用http://msdn.microsoft.com/en-us/library/aa394531%28VS.85%29.aspx,你就不必担心这样的线程垃圾了。
答案 0 :(得分:4)
对我来说,听起来好像Windows并不喜欢你在可能的临时工作线程上做这种工作的方式(正如你所指出的那样)。
如果是这种情况,并且您无法使用工作,一种可能的解决方法是稍微重新考虑您的应用程序,以便始终运行服务线程,您可以查询此信息而不是而不是设置一切并按需要求它。它甚至可能不需要是一个线程,也许只是一个在应用程序启动时设置的实用程序类实例,受锁保护以防止并发访问。
答案 1 :(得分:4)
在“import sys”行之后和“import pythoncom”行之前添加“sys.coinit_flags = 0”。这对我有用,虽然我不知道为什么。