我正在尝试创建一个在python 3.4中创建一个将ping服务器的函数.目前它只需要在Windows上运行(可能是XP及以上版本).
我发现我可以使用WMI Win32_PingStatus(引用)类来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")
Run Code Online (Sandbox Code Playgroud)
这可以按预期工作,因为当你可以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
Run Code Online (Sandbox Code Playgroud)
每次运行脚本时都会发生这种情况,尽管每次更改地址的前2个字节.最后2个字节始终保持不变.
我已经尝试评论代码的各个部分,并发现如果我删除pythoncom.CoUninitialize()异常不会发生.我正在使用pythoncom.CoInitialize(),pythoncom.CoUninitialize()因为我想在这里描述的线程中调用该函数
我已经尝试添加print(pythoncom._GetInterfaceCount())以查看有多少接口存在并注意到每次运行该功能时接口增加6,然后偶尔但不经常减少但是它们不会减少到10以下.
有谁知道为什么会发生这种异常以及处理它的正确方法是什么?
谢谢
我想我已经成功解决了这个问题.看起来你应该只调用pythoncom.CoInitialize()一个单独的线程,因为pythoncom会在主线程http://docs.activestate.com/activepython/2.5/pywin32/pythoncom__CoInitializeEx_meth.html上自动调用它.
所以,我只是检查,如果当前线程是主线程,如果它是我不叫pythoncom.CoInitialize()和pythoncom.CoUninitialize().
| 归档时间: |
|
| 查看次数: |
1974 次 |
| 最近记录: |