No se puede cerrar Excel completamente usando win32com en Python
Este es mi código, y encontré muchas respuestas paraVBA, .NET Framework y es bastante extraño. Cuando ejecuto esto, Excel se cierra.
<code>from win32com.client import DispatchEx excel = DispatchEx('Excel.Application') wbs = excel.Workbooks wbs.Close() excel.Quit() wbs = None excel = None # <-- Excel Closes here </code>
Pero cuando hago lo siguiente, no se cierra.
<code>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 !!! </code>
Encontré alguna respuesta posible en la pregunta de desbordamiento de pilaEl proceso de Excel permanece abierto después de la interoperabilidad; método tradicional no funciona. El problema es que no es Python, y no encuentroMarshal.ReleaseComObject
yGC
. Miré todas las demostraciones en...site-packages/win32com
y otros.
Incluso no me molesta si puedo obtener el PID y matarlo.
He encontrado una solución enProceso de eliminación basado en el nombre de la ventana (win32).
Puede que no sea el camino correcto, pero un entorno de trabajo es:
<code>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!!! </code>