Impossible de fermer complètement Excel en utilisant win32com sur Python
C'est mon code, et j'ai trouvé beaucoup de réponses pour VBA.NET framework et est assez étrange. Lorsque j'exécute ce, Excel se ferme.
from win32com.client import DispatchEx
excel = DispatchEx('Excel.Application')
wbs = excel.Workbooks
wbs.Close()
excel.Quit()
wbs = None
excel = None # <-- Excel Closes here
Mais quand je fais la suite, il ne se ferme pas.
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 !!!
J'ai trouvé quelques réponses possibles à Débordement de Pile question Excel processus reste ouvert après l'interopérabilité; méthode traditionnelle ne fonctionne pas. Le problème est que n'est pas le Python, et je ne trouve pas Marshal.ReleaseComObject
et GC
. J'ai regardé sur toutes les démos sur ...site-packages/win32com
et autres.
Même ça ne me dérange pas si je peux obtenir le PID et le tuer.
J'ai trouvé une solution de contournement dans Tuer les processus en se basant sur le nom de la fenêtre (win32).
Peut-être pas de la bonne façon, mais contourner est:
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!!!
source d'informationauteur sacabuche
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
J'ai cela dans mes fichiers qui utilisent Excel: