Python WMI模块捕获pywintypes.com_error:如何确定正确导入方式?
解决pywintypes.com_error的正确捕获方式
我之前在用WMI模块收集Windows硬件信息时也踩过这个坑,pywintypes的导入逻辑确实有点反直觉——它不是标准的Python包,而是pywin32库提供的扩展模块,所以不能用import pywintypes.com_error这种子模块导入的方式。下面是具体的解决步骤:
1. 正确的导入方法
你有两种可行的导入方式,二选一即可:
- 方式一:先导入pywintypes模块,再引用其中的com_error类
import pywintypes
- 方式二:直接从pywintypes模块导入com_error类
from pywintypes import com_error
之所以import pywintypes.com_error会失败,是因为pywintypes是编译后的二进制模块(.pyd文件),不是包含子模块的包结构,com_error是定义在这个模块内部的类,而非独立的子模块。
2. 捕获异常的完整示例代码
结合你的WMI使用场景,这里给出一个完整的异常捕获示例:
import wmi from pywintypes import com_error try: c = wmi.WMI() numa = c.Win32_PerfFormattedData_PerfOS_NUMANodeMemory() # 后续处理收集到的NUMA节点内存数据 except com_error as e: print(f"COM调用异常: {e.args}") except AttributeError as e: print(f"属性访问异常: {e}")
如果用第一种导入方式,捕获时只需写成except pywintypes.com_error as e:即可。
3. 额外排查提示
如果导入后仍有问题,可以检查:
- pywin32和wmi模块的版本兼容性(建议用pip重新安装最新版的两个库)
- 运行代码的环境是否有足够权限访问Windows性能计数器数据(部分NUMA相关性能数据需要管理员权限)
内容的提问来源于stack exchange,提问作者Elliott B
相关产品推荐
相关产品推荐

