【问题标题】:Win32 exception occurred when using pythoncom.CoUninitialize() and wmi使用 pythoncom.CoUninitialize() 和 wmi 时发生 Win32 异常
【发布时间】:2014-12-22 20:32:14
【问题描述】:

我正在尝试创建一个在 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,而当您不能 ping 时返回 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 以下。

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

谢谢

【问题讨论】:

  • 请将其放入答案中并将其标记为已回答。回答你自己的问题是完全可以接受的:)

标签: python winapi wmi


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 2019-11-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多