2014-04-07 39 views
0

我正在研究一個(很大的)Python/Tkinter應用程序(Windows 7下的Python 2.7),其中許多其他的東西通過COM接口調用Matlab。 Matlab的/ COM部分的基本結構是這樣的:Python:如何在關閉父應用程序後(不)在內存中保留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的實例(打開Matlab的命令窗口),當關閉Tkinter應用程序時,Matlab-window和Task-Manager中的相應條目也會消失。重複該過程,Matlab重新開始。但是,當我對我的「真實」應用程序「相同」時,Matlab實例在關閉我的應用程序後仍然存在,此外,當我重新啓動應用程序並運行「啓動」Matlab的部分時,它只是檢索並使用在退出我的應用程序的第一個會話後仍保留在內存中的實例。不幸的是,我不能夠隔離一個相當小的代碼示例顯示了後者的行爲:(

沒有任何人有一個想法,這樣做的原因是什麼/可能?

怎麼能控制是否COM-對象被殺害或時創建它的父Python應用程序被關閉內存中仍然存在

+0

我不能對此進行測試,但你可以嘗試使用http://effbot.org/tkinterbook/wm.htm#Tkinter.Wm.protocol-method捕捉關閉窗口事件程序關閉之前的'del self.matlab'? – atlasologist

+0

@atlasologist:謝謝:)這工作正常,並回答我的問題的一部分(雖然我仍然想知道:我試圖在應用程序對象的析構函數中調用「del self.matlab」,但此析構函數似乎不被稱爲當程序通過x-Button關閉時...)。但相反,有一種方法可以明確控制即使整個Python/Tkinter應用程序關閉,Matlab實例仍然保留在內存中嗎? – Pascal31459

+0

我不認爲有一種方法可以讓COM對象在內存中保留 - 我認爲它會。查看我的答案,查看代碼示例,該示例合併了銷燬窗口和刪除對象的協議。 – atlasologist

回答

0

下面是如何明確地刪除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() 

參考:Removing COM object from memory

More on protocols

相關問題