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

标签 python excel python-2.7 com vba

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

最佳答案

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

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

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

pythoncom.CoInitialize()

在 Dispatch 之前,以及

pythoncom.CoUninitialize()

退出后

关于python - COM: excelApplication.Application.Quit() 保留进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18421457/

相关文章:

python - 来自 tkinter 应用程序的多线程

python - 如何使用 Pexpect 执行 root 命令?

python - 当我使用 np.savetxt 时,为什么我的数组空间不正确

c# - 从 Excel 返回数据列表

python-2.7 - Pylint 无法处理抽象基类的抽象子类

python Pandas : Add column to grouped DataFrame with method chaining

mysql - Python MySQLdb - 围绕 SQL 注入(inject)代码编程

python - 如何在 python 中使用 xpath 查询带有命名空间的 xml 数据

excel - 为细胞着色的另一种更快的方法

c# - 使用 epplus 将 Excel 保存为电子表格 xml 2003