Bug描述
在使用 win32com.client
或 wmi
模块调用 COM 对象时,程序抛出以下错误:
pywintypes.com_error: (-2147221020, '无效的语法', None, None)
该错误发生在尝试调用 win32com.client.GetObject
或 wmi.WMI()
的过程中,表明 COM 环境未正确初始化,导致调用失败。
Bug 产生原因
-
COM 环境未初始化:
- Python 的
win32com
和wmi
模块依赖 COM 环境,而在多线程或特定运行环境(如服务)中,未显式初始化 COM 环境会导致错误。 - 在 Windows 服务或子进程中运行时,默认情况下不会自动初始化 COM 环境。
- Python 的
-
运行环境差异:
- 本地运行脚本时,COM 环境可能由主线程自动初始化,因此不会出现错误。
- 打包后或以 Windows 服务的形式运行时,必须手动初始化 COM 环境。
解决方法
在调用任何依赖 COM 的模块(如 win32com.client
或 wmi
)前,显式初始化 COM 环境:
import pythoncom
pythoncom.CoInitialize()
# wmi前面初始化
import wmi
在程序结束时,确保释放 COM 环境(非必须):
pythoncom.CoUninitialize()