【问题标题】:COM: excelApplication.Application.Quit() preserves the processCOM:excelApplication.Application.Quit() 保留进程
【发布时间】:2013-08-27 14:30:39
【问题描述】:

我正在使用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 和anylse 的异常(或者我在这里做了什么?)。我对区分“不存在的进程”终止尝试和终止进程的失败尝试特别感兴趣。

【问题讨论】:

    标签: python excel python-2.7 com vba


    【解决方案1】:

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

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

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

    pythoncom.CoInitialize()
    

    发货前,

    pythoncom.CoUninitialize()
    

    退出后

    【讨论】:

    • 谢谢,做到了:import pythoncom import win32com.client pythoncom.CoInitialize() excelApp = win32com.client.dynamic.Dispatch('Excel.Application') excelApp.Application.Quit() pythoncom.CoUninitialize() 我退出 Excel 的方法看起来也有点像这样,但我只是做了一个简单的例子来说明这个问题。
    • pythoncom.CoUninitialize() 有什么作用,如果我有其他 COM 对象,每次退出时多次调用它是否安全?
    • @Greedo 抱歉,我不在,没有看到你的消息。坦率地说,我不知道,抱歉。
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多