python and excel integration
No se puede cerrar Excel completamente usando win32com en Python (2)
Este es mi código, y encontré muchas respuestas para VBA , .NET framework y es bastante extraño. Cuando ejecuto esto, Excel se cierra.
from win32com.client import DispatchEx
excel = DispatchEx(''Excel.Application'')
wbs = excel.Workbooks
wbs.Close()
excel.Quit()
wbs = None
excel = None # <-- Excel Closes here
Pero cuando hago lo siguiente, no se cierra.
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 !!!
Encontré alguna respuesta posible en la pregunta sobre desbordamiento de pila. El proceso de Excel permanece abierto después de la interoperabilidad; método tradicional no funciona . El problema es que no es Python, y no encuentro Marshal.ReleaseComObject
y GC
. Revisé todas las demos en ...site-packages/win32com
y otros.
Incluso no me molesta si consigo el PID y matarlo.
Encontré una solución en el proceso de Kill basado en el nombre de la ventana (win32) .
Puede que no sea la forma correcta, pero un workround es:
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!!!
Tengo esto en mis archivos que usan Excel:
self.excel.Application.Quit()
Prueba esto:
wbs.Close()
excel.Quit()
del excel # this line removed it from task manager in my case