Nie można całkowicie zamknąć programu Excel przy użyciu win32com w Pythonie

To jest mój kod i znalazłem wiele odpowiedziVBA, .NET Framework i jest dość dziwny. Kiedy to wykonam, Excel zamyka się.

<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>

Ale kiedy wykonuję następujące czynności, nie zamyka się.

<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>

Znalazłem możliwą odpowiedź w pytaniu Przepełnienie stosuProces Excel pozostaje otwarty po interopie; metoda tradycyjna nie działa. Problem polega na tym, że nie jest to Python i nie znajdujęMarshal.ReleaseComObject iGC. Przejrzałem wszystkie prezentacje...site-packages/win32com i inni.

Nawet to mi nie przeszkadza, jeśli mogę po prostu zdobyć PID i zabić go.

Znalazłem obejście wZabij proces na podstawie nazwy okna (win32).

Może nie jest to właściwy sposób, ale praca to:

<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>

questionAnswers(2)

yourAnswerToTheQuestion