异常:
使用
好死不死,昨天(2024年1月17日),我又碰到了这个问题,第四次了!,下面是业务场景:
线上测试时,有一台机器报错,同时本地开发环境也报同样的错:
win32com 是如何工作的
弄清楚这个问题,一切就好办了。我们直接以
from win32com.client import Dispatch client = Dispatch('kwps.application')
无效的类字符串 的错误在Dispatch('kwps.application') 这一步就会出现。
为何实参
实参是什么,实际上是由程序在windows注册表中的程序ID(
在注册表中搜索关键词
跑题:你是否也看到了截图中红框下方有
KWPS.Document ,那么,是不是也可以Dispatch('kwps.document') ,它会启动一个什么呢?我已经试过了,并且瞬间就找到了一个为下游机器节省开销的方法。有好奇心的你不妨也尝试下。
分析
有了上面的理解作为基础,再来分析报错的原因。
情况一
错误的程序ID
当我使用
情况二
正常运行的程序,突然不行了
由于某种原因,程序的注册表信息有损坏导致
情况三
在IDE中可以运行,但在
cmd 窗口中就无法执行,在其他电脑上也正常
如图,这是我自己测试的
图一:在PowShell中运行出错
图二:在vscode中运行正常
其实,之前大概率碰到的就是这种情形,莫名其妙就崩了。我将这两张图发到群里时,估计有不少朋友都看出问题所在了:权限问题。
情景还原
截图中涉及到的是上面提到的下游机器之一,不过是在本地的开发环境中,是一套
测试一
写个
from win32com.client import Dispatch client = Dispatch('kwps.application') client.Quit()
1、分别使用
2、使用当前用户身份来启动
上面提到,我的
测试二
把demo.py变成多进程,如下:
import pythoncom from multiprocessing import Process from win32com.client import DispatchEx def demo(): pythoncom.CoInitialize() client = DispatchEx('kwps.application') print('wps客户端实例:', client) client.Quit() pythoncom.CoUninitialize() if __name__ == '__main__': p = Process(target=demo) p.start()
再次重复测试一的步骤,测试结果一致。不关乎进程,测试结果只和身份有关,
更为详细的原因,我就不得而知了,超纲了。但已经完全可以确定,这种情况与权限有关,即以何种权限来启动程序,和当前的用户身份是否匹配。如果哪位大佬知晓更为本质的原因,欢迎点拨一二。
回到我的项目中,我一定是手贱了,在本地无意中以
由于知识有限,个人的分析并不一定正确,碰到的情况也并不一定和你的相同,所以,非常欢迎你加入到