【问题标题】:"Win32 exception occurred releasing IUnknown at..." error using Pylons and WMI“Win32 异常发生释放 IUnknown at ...”使用 Pylons 和 WMI 的错误
【发布时间】:2010-05-21 08:57:21
【问题描述】:

我将 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 & CoUninitialize”主题下的示例包装了代码,这使得代码工作,但它不断抛出"Win32 exception occurred releasing IUnknown at..."

然后查看http://mail.python.org/pipermail/python-win32/2007-August/006237.html 和后续帖子,尝试跟进 - 但是pythoncom._GetInterfaceCount() 始终是 20。

我猜这在某种程度上与 Pylons 产生工作线程和类似的废话有关,但是我有点迷失在这里,建议会很好。

提前致谢,

安德斯

编辑:如果你正在做类似的事情,不要打扰 WMI 模块,只需使用 http://msdn.microsoft.com/en-us/library/aa394531%28VS.85%29.aspx ,你不必担心这样的线程废话。

【问题讨论】:

  • 你能用 CoInitialize 发布整个列表
  • 没问题,我回家后就开始了。

标签: python multithreading wmi pylons


【解决方案1】:

在“import sys”行之后和“import pythoncom”行之前添加“sys.coinit_flags = 0”。这对我有用,虽然我不知道为什么。

【讨论】:

  • 我得查一下。感谢您的建议。
  • 0 == pythoncom.COINIT_MULTITHREADED ;这会强制 com 线程模型为多线程,如果您使用工作线程,这是一个隐含的要求。
  • Ondergetekende,怎么用?放在哪里?
【解决方案2】:

在我看来,Windows 不喜欢你在可能是临时工作线程上做这种工作的方式(正如你所指出的那样)。

如果是这种情况,并且您无法让事情正常工作,一种可能的解决方法是稍微重构您的应用程序,以便始终运行一个服务线程,您可以查询此信息而不是而不是设置一切并按需要求。它甚至可能不需要是一个线程,也许只是一个实用程序类实例,您在应用程序启动时设置它,用锁保护以防止并发访问。

【讨论】:

  • 好建议,我会返回此主题并提供更多信息,感谢您的回复。
猜你喜欢
  • 2014-12-22
  • 1970-01-01
  • 2015-12-31
  • 2019-11-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多