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>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage