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

Ale*_*tke 6 python com excel vba excel-vba python-2.7

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

import win32com.client
excelApp = win32com.client.dynamic.Dispatch('Excel.Application')
Run Code Online (Sandbox Code Playgroud)

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

excelApp.Application.Quit()
Run Code Online (Sandbox Code Playgroud)

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

subprocess.Popen("taskkill /F /im EXCEL.EXE",shell=True)
Run Code Online (Sandbox Code Playgroud)

强制/F标志是必要的,否则进程不会终止.

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

另外我注意到,subprocess.Popen("taskkill")不会返回任何我可以catch和任何异常的例外(或者我在这里做些什么?).我特别感兴趣的是区分"不存在的进程"杀死尝试和终止进程失败的尝试.

use*_*863 7

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

      def quit(self):
        self.xlBook.Close(SaveChanges=0)
        self.xlApp.Quit()
        del self.xlApp
Run Code Online (Sandbox Code Playgroud)

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

pythoncom.CoInitialize()
Run Code Online (Sandbox Code Playgroud)

在Dispatch之前,和

pythoncom.CoUninitialize()
Run Code Online (Sandbox Code Playgroud)

退出后

  • 谢谢,做到了:`import pythoncom import win32com.client pythoncom.CoInitialize() excelApp = win32com.client.dynamic.Dispatch('Excel.Application') excelApp.Application.Quit() pythoncom.CoUninitialize()` 我的方法退出 Excel 看起来也有点像这样,但我只是做了一个简单的例子来说明这个问题。 (3认同)