python调用win32api 拉起wps问题排查解决方案

2023-08-08 14:57:43 浏览数 (1)

系列文章

【毕业设计】基于mqtt vue Thinkphp实现校园云打印小程序 (暂未完成更新)

前言

因为这篇文章【毕业设计】基于mqtt vue Thinkphp实现校园云打印小程序,我想通过mqtt唤醒客户端调用打印机,但是在实现过程中其他生产环境没办法使用,不是出现报错就是未知错误,期间找了很多方案,最后整合一下我的处理结果,建议大家配合文章查看,不然就搞不懂我在说啥

问题排查

第一个问题,pywintypes.com_error: (-2147221005, ‘无效的类字符串’, None, None)

通过编译后的tk软件在其他电脑上能运行但是不会处理,猜想应该是代码错误导致停止运行了

我的验证方法是,在其他电脑上运行源代码,发现出现错误

代码语言:javascript复制
pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)

解决办法 报错的代码是这一段,大概就是调用wps出错,因为我的wps版本是抢先版,所以需要用kwps

代码语言:javascript复制
 w = DispatchEx('wps.Application')
 w.Visible = 0  # 不打开软件
w.DisplayAlerts = 0  # 不报错
doc = w.Documents.Open(f)

改了之后的代码,完美运行:

代码语言:javascript复制
 w = DispatchEx('kwps.Application')
 w.Visible = 0  # 不打开软件
 w.DisplayAlerts = 0  # 不报错
 doc = w.Documents.Open(f)

只需要装有同个版本的wps即可解决

第二个问题,pywintypes.com_error: (-2147221008, ‘尚未调用 CoInitialize。’, None, None)

原因:经网上查明:是由于多线程使用pywin32com造成的问题

解决办法:

代码语言:javascript复制
import pythoncom
 

# 线程初始化
pythoncom.CoInitialize()
 
# 程序代码
# 程序代码


# 释放资源
pythoncom.CoUninitialize()

于是在调用打印代码的第一行写入线程初始化

代码语言:javascript复制
pythoncom.CoInitialize()

末尾释放资源

代码语言:javascript复制
pythoncom.CoUninitialize()

最后代码:

代码语言:javascript复制
# 线程初始化
pythoncom.CoInitialize()
## 需要打印文件或文件夹的路径
path = r'C:UsersMACDesktoptest'
traver(path)
print("文件读取完毕,共有{}个".format(q.qsize()))
docx_print()
# 释放资源
pythoncom.CoUninitialize()

完美解决以上问题!!!

总结

以上就是记录今天遇到的问题,pywin32api打印机问题完美解决,不过调用的只能是wps

0 人点赞