gpt4 book ai didi

python - 使用 pythoncom.CoUninitialize() 和 wmi 时出现 Win32 异常

转载 作者:行者123 更新时间:2023-11-28 21:53:21 24 4
gpt4 key购买 nike

我正在尝试创建一个在 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()) 以查看存在多少个接口(interface),并注意到每次运行该函数时接口(interface)增加 6,然后偶尔但不经常减少,但是他们不会减少到 10 以下。

有谁知道为什么会出现此异常以及正确的处理方法是什么?

谢谢

最佳答案

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

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

关于python - 使用 pythoncom.CoUninitialize() 和 wmi 时出现 Win32 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26591358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com