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-объекта из памяти

Подробнее о протоколах

Другие вопросы по тегам