2014-10-27 78 views
1

時發生Win32異常我想創建一個在python 3.4中創建一個函數來ping一個服務器。目前它只需要在Windows上工作(可能是XP及以上版本)。當使用pythoncom.CoUninitialize()和wmi

我發現我可以使用WMI的Win32_PingStatus(Reference)類來ping服務器,並寫了下面的功能:

import sys 

if sys.platform.startswith('win32'): 
    import wmi 
    import pythoncom 


def ping(ip_address): 
    """ Check if can ping ip address using OS ping tool""" 
    if sys.platform.startswith('win32'): 
     try: 
      pythoncom.CoInitialize() 
      c = wmi.WMI() 
      status_code = c.Win32_PingStatus(address=ip_address)[0].StatusCode 
      if status_code == 0: 
       successful = True 
      else: 
       successful = False 

      pythoncom.CoUninitialize() 

     except wmi.x_wmi: 
      # If WMI ping fails fallback 
      pass 

    else: 
     raise NotImplementedError 

    return successful 

if __name__ == "__main__": 
    ping("127.0.0.1") 

這按預期工作,因爲它返回True時,您可以ping IP如果不能,則爲假。但是我每次運行它的時候我在最後得到了一系列的錯誤:

Win32 exception occurred releasing IUnknown at 0x03140980 
Win32 exception occurred releasing IUnknown at 0x031635d0 
Win32 exception occurred releasing IUnknown at 0x03163560 

出現這種情況我每次運行該腳本雖然前2個字節的地址的每次改變時間。最後2個字節總是保持不變。

我試過註釋掉代碼的各個部分,並發現如果我刪除pythoncom.CoUninitialize(),則不會發生異常。我使用pythoncom.CoInitialize()pythoncom.CoUninitialize(),因爲我想描述here

我曾嘗試加入print(pythoncom._GetInterfaceCount()),看看有多少接口都存在,並已注意到,每次運行該功能由6接口增加調用的函數在一個線程然後偶爾但不經常減少,但他們不會減少到10以下。

有誰知道爲什麼會發生這種異常,處理它的正確方法是什麼?

謝謝

+0

請把它放在答案中,並標記爲已回答。回答你自己的問題完全可以接受:) – Steve 2014-10-27 21:42:34

回答