«Произошло исключение Win32 при освобождении IUnknown at ...» с помощью Pylons и WMI - PullRequest
2 голосов
/ 21 мая 2010

Я использую Pylons в сочетании с модулем WMI для базового системного мониторинга пары машин, для систем на основе POSIX все просто - для Windows - не так уж и много.

Выполнение запроса к серверу Pylons для получения текущего процессора, однако он не работает должным образом или, по крайней мере, с модулем 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 порождает рабочие потоки и всякую ерунду, как бы там ни было, но я вроде бы здесь потерян, совет был бы неплох.

Заранее спасибо,

Anders

РЕДАКТИРОВАТЬ: Если вы делаете что-то подобное, не беспокойтесь о модуле WMI, просто используйте http://msdn.microsoft.com/en-us/library/aa394531%28VS.85%29.aspx, и вам не нужно беспокоиться о том, что потоки дерьма похожи на это.

Ответы [ 2 ]

4 голосов
/ 09 сентября 2010

Добавьте «sys.coinit_flags = 0» после строки «import sys» и перед строкой «import pythoncom». Это сработало для меня, хотя я не знаю почему.

4 голосов
/ 25 мая 2010

Мне кажется, что Windows не нравится, как вы выполняете эту работу над тем, что, вероятно, является временными рабочими потоками (как вы указали).

Если это так, и вы не можете заставить что-то работать, одним из возможных обходных путей может быть незначительный перефакторинг вашего приложения, чтобы постоянно работал служебный поток, который вы можете запросить для этой информации чем все настраивать и просить об этом по требованию. Это может даже не быть потоком, возможно, просто экземпляром служебного класса, который вы настраиваете при запуске приложения и который защищен блокировкой для предотвращения одновременного доступа.

...