2010-05-21 84 views
2

對於基於POSIX的系統,使用Pylons和WMI模塊一起對一些機器執行一些基本系統監控,一切都很簡單 - 對於Windows - 沒那麼多。使用Pylons和WMI發佈「在發佈IUnknown時出現Win32異常...」錯誤使用Pylons和WMI

向Pylons服務器發出請求以獲取當前CPU,但它運行不正常,或至少與WMI模塊一起工作。首先,我只是做了(某事)這樣的:

c = wmi.WMI() 
for cpu in c.Win32_Processor(): 
    value = cpu.LoadPercentage 

然而,訪問通過塔這個模塊(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..."

並且th恩看着http://mail.python.org/pipermail/python-win32/2007-August/006237.html和跟進後,試圖遵循 - 然而pythoncom._GetInterfaceCount()始終是20

即時猜測這是好歹相關主塔產卵工作線程和垃圾一樣的是,但是我在這裏有點丟失,建議是不錯。

由於提前,

安德斯

編輯:如果你正在做類似的東西,不與WMI模塊麻煩,只需使用http://msdn.microsoft.com/en-us/library/aa394531%28VS.85%29.aspx,你不必擔心線程廢話喜歡這個。

+0

你可以用CoInitialize發佈整個列表嗎? – Dewfy 2010-05-23 12:20:13

+0

沒問題,當我回家的時候,我就明白了。 – Anders 2010-05-23 12:25:47

回答

3

對我來說,聽起來像Windows不喜歡你正在做什麼可能是臨時工作線程的工作方式(正如你指出的那樣)。

如果是這種情況,並且無法讓事情發揮作用,則可能的解決方法之一是稍微重新分配應用程序,以便始終運行可以查詢此信息的服務線程而不是將所有東西都設置好並按要求提出要求。它可能甚至不需要是一個線程,也許只是一個實用程序類實例,您可以在應用程序啓動時設置它,並使用鎖保護以防止併發訪問。

+0

良好的建議,我回到這個線程與更多的信息,謝謝你的答覆。 – Anders 2010-05-26 11:19:12

4

在「import sys」行之後和「import pythoncom」行之前添加「sys.coinit_flags = 0」。這對我有效,但我不知道爲什麼。

+0

我得看看。感謝您的建議。 – Anders 2010-09-10 07:22:33

+0

0 == pythoncom.COINIT_MULTITHREADED; 這會強制com線程模型爲多線程,如果您正在使用workerthreads,這是一個隱含的要求。 – Ondergetekende 2011-11-03 13:55:39