使用Python上的win32com无法完全closuresExcel

这是我的代码,我发现很多VBA ,.NET框架的答案,很奇怪。 当我执行这个时,Excelclosures。

from win32com.client import DispatchEx excel = DispatchEx('Excel.Application') wbs = excel.Workbooks wbs.Close() excel.Quit() wbs = None excel = None # <-- Excel Closes here 

但是,当我做了以下,它不closures。

 excel = DispatchEx('Excel.Application') wbs = excel.Workbooks wb = wbs.Open('D:\\Xaguar\\A1.xlsm') wb.Close(False) wbs.Close() excel.Quit() wb = None wbs = None excel = None # <-- NOT Closing !!! 

我发现一些可能的答案堆栈溢出问题Excel进程仍然打开后互操作; 传统的方法不工作 。 问题是,这不是Python,我没有findMarshal.ReleaseComObjectGC 。 我查看了...site-packages/win32com和其他所有的演示。

即使不打扰我,如果我能得到PID并杀死它。

我发现基于窗口名称(win32)杀死过程中的解决方法。

可能不是正确的方法,但一个workround是:

 def close_excel_by_force(excel): import win32process import win32gui import win32api import win32con # Get the window's process id's hwnd = excel.Hwnd t, p = win32process.GetWindowThreadProcessId(hwnd) # Ask window nicely to close win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) # Allow some time for app to close time.sleep(10) # If the application didn't close, force close try: handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, p) if handle: win32api.TerminateProcess(handle, 0) win32api.CloseHandle(handle) except: pass excel = DispatchEx('Excel.Application') wbs = excel.Workbooks wb = wbs.Open('D:\\Xaguar\\A1.xlsm') wb.Close(False) wbs.Close() excel.Quit() wb = None wbs = None close_excel_by_force(excel) # <--- YOU #@#$# DIEEEEE!! DIEEEE!!! 

尝试这个:

 wbs.Close() excel.Quit() del excel # this line removed it from task manager in my case 

我在使用Excel的文件中有这个:

 self.excel.Application.Quit()