Mit win32com unter Python kann Excel nicht vollständig geschlossen werden
Dies ist mein Code und ich habe viele Antworten dafür gefundenVBA, .NET Framework und ist ziemlich seltsam. Wenn ich dies ausführe, wird Excel geschlossen.
<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>
Aber wenn ich das Folgende mache, wird es nicht geschlossen.
<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>
Ich habe in der Frage zum Stapelüberlauf eine mögliche Antwort gefundenDer Excel-Prozess bleibt nach dem Interop geöffnet. traditionelle Methode funktioniert nicht. Das Problem ist, dass es sich nicht um Python handelt und ich es nicht findeMarshal.ReleaseComObject
undGC
. Ich habe alle Demos durchgesehen...site-packages/win32com
und andere.
Es stört mich auch nicht, wenn ich nur die PID bekomme und sie töte.
Ich habe eine Problemumgehung in gefundenKill-Prozess basierend auf dem Fensternamen (win32).
Ist vielleicht nicht der richtige Weg, aber ein Workround ist:
<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>