Can't close Excel completely using win32com on Python
Question: This is my code, and I found many answers for
[VBA](http://en.wikipedia.org/wiki/Visual_Basic_for_Applications), .NET
framework and is pretty strange. When I execute this, Excel closes.

    
    
    from win32com.client import DispatchEx
    excel = DispatchEx('Excel.Application')
    wbs = excel.Workbooks
    wbs.Close()
    excel.Quit()
    wbs = None
    excel = None # <-- Excel Closes here
    

But when I do the following, it does not close.

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

I found some possible answer in Stack Overflow question _[Excel process
remains open after interop; traditional method not
working](http://stackoverflow.com/questions/8977571/excel-process-remains-
open-after-interop-traditional-method-not-working)_. The problem is that is
not Python, and I don't find `Marshal.ReleaseComObject` and `GC`. I looked
over all the demos on `...site-packages/win32com` and others.

Even it does not bother me if I can just get the PID and kill it.

I found a workaround in _[Kill process based on window name
(win32)](http://python.6.n6.nabble.com/Kill-process-based-on-window-name-
win32-td1042063.html)_.

May be not the proper way, but a workround is:

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


Answer: Try this:

    
    
    wbs.Close()
    excel.Quit()
    del excel # this line removed it from task manager in my case
    

