Python のライブラリを使用して Minitab 17 を自動化win32com
しています。すべてのコマンドは正しく実行されますが、Minitab プロセスによって開始されたプロセスがスクリプトの終了時に終了するようには見えません。私の構造は次のようになります
from myapi import get_data
import pythoncom
from win32com.client import gencache
def process_data(data):
# In case of threading
pythoncom.CoInitialize()
app = gencache.EnsureDispatch('Mtb.Application')
try:
# do some processing
pass
finally:
# App-specific command that is supposed to close the software
app.Quit()
# Ensure the object is released
del mtb
# In case of threading
pythoncom.CoUninitialize()
def main():
data = get_data()
process_data(data)
if __name__ == '__main__':
main()
例外が発生したり、エラー メッセージが出力されたりすることはありませんMtb.exe
。プロセスはまだタスク マネージャーに表示されています。さらにイライラするのは、IPython セッションで次のコマンドを実行した場合です。
>>> from win32com.client import gencache
>>> app = gencache.EnsureDispatch('Mtb.Application')
>>> ^D
Minitab プロセスはすぐに閉じられます。通常のpython
インタラクティブ セッションでも同じ動作が見られます。 スタンドアロン スクリプトではなく、インタラクティブ セッションで実行すると、プロセスが正しく閉じられるのはなぜですか? 私のスクリプトで実行されていない別の方法は何ですか?
また、運が悪かったので、実行process_data
してみました。threading.Thread
multiprocessing.Process
編集:
何も含まないスクリプトがある場合
from win32com.client import gencache
app = gencache.EnsureDispatch('Mtb.Application')
その後、実行するとMtb.exe
タスクマネージャーにプロセスが表示されますが、スクリプトが終了するとプロセスは強制終了されます。代わりに、私の質問は、この COM オブジェクトがトップレベルで宣言されているか、関数内で宣言されているかが問題になるのはなぜですか?