7

我正在使用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)

forceful/F标志是必要的,否则进程不会终止。

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

此外,我注意到这subprocess.Popen("taskkill")并没有返回任何我可以catch和任何异常(或者我在这里做了什么?)。我对区分“不存在的进程”终止尝试和终止进程的失败尝试特别感兴趣。

4

1 回答 1

11

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

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

你是从主线程调用 Dispatch 吗?如果不是一定要打电话

pythoncom.CoInitialize()

发货前,以及

pythoncom.CoUninitialize()

退出后

于 2013-08-24T18:33:42.107 回答