pywintypes.com_error: (-2147352567, '发生意外 解决方案 :出现在Python调用WPS中

这几日做了一个小程序,主要功能是使用win32com库调用WPS,并运用一些简单的二次开发指令,实现文件格式的转换并另存为新文件。

大致代码如下:

import win32com
import win32com.client
w=win32com.client.constants
wps=win32com.client.gencache.('kwps.application')
d=wps.Documents.Open(r'C:\Users\asus\Desktop\project\文档2.docx')
d.SaveAs2(FileName=r'C:\Users\asus\Desktop\project\文档文本.txt',FileFormat=w.wdFormatText
)

程序运行报错:

pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Kingsoft WPS', '文档保存失败。', '', 3011, -2147467259), None)

在网上找了很久,最后在一个博客里看到有人使用了

win32com.client.gencache.EnsureDispatch

加载了WPS,便在我的程序中使用了,不过那位博主也提出:“不知道解决的原因是什么。”我在使用了EnsureDispatch后,问题也凑巧得到了“解决”(继续看下去),代码如下:

import win32com
import win32com.client
w=win32com.client.constants
wps=win32com.client.gencache.EnsureDispatch('kwps.application')
d=wps.Documents.Open(r'C:\Users\asus\Desktop\project\文档2.docx')
d.SaveAs2(FileName=r'C:\Users\asus\Desktop\project\文档文本.txt',FileFormat=w.wdFormatText
)

出于某种好运,文件被成功保存了。我以为问题就解决了呢,直到程序已经提交,今天思考并尝试才发现:问题压根就没被解决。


经过我的反复尝试,我发现:

问题的出现原因并不是接入的方式或者其他什么原因,而是一个很简单的原因:当前程序没有对目标文件的支配权限。也就是说,我们挂载的WPS并没有权限去另存为这个被打开的文档。继续深究,原因很简单也很可笑:

之前打开的WPS尚未被关闭。

这个时候,出现问题是很自然的事情了。在采用EnsureDispatch的同时,我恰巧手动关闭了WPS的进程,再发现运行成功后也没有再试,而是继续编写了后续关闭挂载程序的函数,所以问题也就再没有出现过……以至于我认为它“解决了”。

附上关闭WPS的代码:

def closesoft():
    print('''挂载程序关闭中……

          ''')
    import win32com
    import win32com.client
    wc=win32com.client.constants

    try:
        wps=win32com.client.gencache.EnsureDispatch('kwps.application')
    except:
        wps=win32com.client.gencache.EnsureDispatch('wps.application')
    else:
        wps=win32com.client.gencache.EnsureDispatch('word.application')
    try:
        wps.Documents.Close()
        wps.Documents.Close(wc.wdDoNotSaveChanges)
        wps.Quit
    except:pass

它可以关闭两种WPS和MS WORD,稍加修改也可以关闭PPT和ET。

虽然最后并不真的影响程序使用,但问题依然存在,记下来,各位以后可以知道原因。

你可能感兴趣的:(python学习)