私は (かなり大きな) Python/Tkinter アプリケーション (Windows 7 では Python 2.7) に取り組んでおり、これは (とりわけ) COM インターフェイス経由で Matlab を呼び出します。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-window と Task-マネージャー失踪。手順を繰り返して、Matlab を再起動します。ただし、「実際の」アプリケーションで「同じ」ことを行うと、アプリケーションを閉じた後も Matlab インスタンスが保持され、さらに、アプリケーションを再起動して Matlab を「開始」する部分を実行すると、インスタンスが取得されて使用されます。アプリの最初のセッションを終了した後もメモリに残っていました。残念ながら、後者の動作を示すかなり小さなコード例を分離することはできません:(
これの理由が何であるか、またはその理由を知っている人はいますか?
COM オブジェクトを作成した親 Python アプリケーションが閉じられたときに、COM オブジェクトを強制終了するかメモリに保持するかをどのように制御できますか?