COM:excelApplication.Application.Quit()保留进程

发布于 2021-01-29 18:02:34

我正在使用COM集成从Python 2.7驱动MS Excel。我注意到一个奇怪的事情:当我运行以下代码时:

import win32com.client
excelApp = win32com.client.dynamic.Dispatch('Excel.Application')

EXCEL.EXE过程中出现的过程列表(视图中使用Windows任务管理器或上subprocess.Popen('tasklist'))按预期方式。然后,我会做所有我不需要做的事情。但是,当我关闭Excel时:

excelApp.Application.Quit()

即使我关闭了启动它的Python解释器,该过程仍然会持续(这种情况很有意义,因为Excel在不同的过程中运行,但可以肯定)。我发现终止此过程的唯一方法是手动使用任务管理器,或通过调用:

subprocess.Popen("taskkill /F /im EXCEL.EXE",shell=True)

强制/F标记是必需的,否则该过程不会终止。

这不是一个真正的问题(我希望),但是我想问一下,当我首先“正常”编辑文档,然后从python调用Excel,然后再次“正常”调用文档时,是否会引起问题?可能连续很多(几打)次?我担心的是创建有冲突的文档等版本。还是EXCEL.EXE为了安全起见,我应该每次都终止该过程吗?

我也注意到,subprocess.Popen("taskkill")它不会返回任何我可以catch并且可能会返回的异常(或者我在这里做些什么吗?)。我对区分“不存在的进程”杀死尝试和终止进程的失败尝试特别感兴趣。

关注者
0
被浏览
35
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    尝试关闭所有打开的书,告诉应用退出并删除对应用的任何引用。我通常将com对象包装在一个类中。这就是我的退出方法的样子。

          def quit(self):
            self.xlBook.Close(SaveChanges=0)
            self.xlApp.Quit()
            del self.xlApp
    

    您是从主线程调用Dispatch吗?如果不确定,请致电

    pythoncom.CoInitialize()
    

    派遣前,以及

    pythoncom.CoUninitialize()
    

    退出后



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看