Python: Как (не) сохранить COM-объект постоянным в памяти после закрытия родительского приложения?
Я работаю над (довольно большим) Python/Tkinter-приложением (Python 2.7 под Windows 7), которое (среди прочего) вызывает Matlab через COM-интерфейс. Основная структура Matlab/COM-части выглядит следующим образом:
import Tkinter
import pythoncom
import win32com.client
class App( object ):
def __init__( self, parent ):
Tkinter.Button( root, text="Start Matlab", command=self.start_matlab ).grid()
def start_matlab( self ):
self.matlab = win32com.client.Dispatch( "Matlab.Application" )
root = Tkinter.Tk()
App( root )
root.mainloop()
Поведение, которое я наблюдаю в этом упрощенном коде: при запуске приложения и нажатии кнопки создается Matlab-Instance (открывается окно Matlab-Command), а при закрытии приложения Tkinter также это Matlab-окно и соответствующая запись в Task- Менеджер исчезнет. Повторяя процедуру, Matlab запускается заново. Однако, когда я делаю "то же самое" с моим "настоящим" приложением, экземпляр Matlab сохраняется после закрытия моего приложения и, более того, когда я перезапускаю приложение и запускаю часть, которая "запускает" Matlab, он просто извлекает и использует экземпляр который остался в памяти после выхода из первой сессии моего приложения. К сожалению, я не могу выделить достаточно небольшой пример кода, показывающий последнее поведение:(
У кого-нибудь есть идея, в чем причина / может быть причина?
Как можно контролировать, уничтожается ли COM-объект или сохраняется в памяти, когда родительское приложение Python, которое его создало, закрыто?
1 ответ
Вот как явно удалить COM-объект, используя обработчик протокола Tkinter:
import Tkinter
import pythoncom
import win32com.client
class App( object ):
def __init__( self, parent ):
self.parent = parent #reference to root
Tkinter.Button( root, text="Start Matlab", command=self.start_matlab ).grid()
self.parent.protocol('WM_DELETE_WINDOW', self.closeAll) #protocol method
def start_matlab( self ):
self.matlab = win32com.client.Dispatch( "Matlab.Application" )
def closeAll(self):
del self.matlab #delete the COM object
self.parent.destroy() #close the window
root = Tkinter.Tk()
App( root )
root.mainloop()
Ссылка: удаление COM-объекта из памяти