使用pythoncom.CoUninitialize()和wmi时发生Win32异常

时间:2014-10-27 15:44:12

标签: python winapi wmi

我正在尝试创建一个在python 3.4中创建一个将ping服务器的函数。目前它只需要在Windows上运行(可能是XP及以上版本)。

我发现我可以使用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")

这可以正常工作,因为当你可以ping IP时它会返回True,而当你不能时它会返回false。但是每次我运行它都会在最后得到一系列错误:

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以下如初。

有谁知道为什么会发生这种异常以及处理它的正确方法是什么?

谢谢

1 个答案:

答案 0 :(得分:5)

我想我已经成功解决了这个问题。看起来你应该只在一个单独的线程中调用pythoncom.CoInitialize(),因为pythoncom会在主线程http://docs.activestate.com/activepython/2.5/pywin32/pythoncom__CoInitializeEx_meth.html上自动调用它。

所以我只检查当前线程是否是主线程,如果是,我不会调用pythoncom.CoInitialize()pythoncom.CoUninitialize()