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

2024-04-25 17:37:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python3.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,当你不能ping时返回false。但是每次我运行它,最后都会出现一系列错误:

^{pr2}$

每次运行脚本时都会发生这种情况,尽管地址的前2个字节每次都会更改。最后2个字节始终保持不变。在

我试着注释掉代码的各个部分,发现如果我删除pythoncom.CoUninitialize(),则不会发生异常。我正在使用pythoncom.CoInitialize()和{},因为我想调用线程中的函数,如here

我尝试添加print(pythoncom._GetInterfaceCount())来查看有多少个接口存在,并且注意到每次函数运行时,接口都会增加6个,然后偶尔减少,但并不经常减少,但是它们不会减少到10个以下。在

有人知道为什么会发生这种异常吗?正确的处理方法是什么?在

谢谢你


Tags: 函数importip服务器ifaddresssysping
1条回答
网友
1楼 · 发布于 2024-04-25 17:37:11

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

所以我只检查当前线程是否是主线程,如果是,我就不调用pythoncom.CoInitialize()和{}。在

相关问题 更多 >