1

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.Threadmultiprocessing.Process

編集:

何も含まないスクリプトがある場合

from win32com.client import gencache
app = gencache.EnsureDispatch('Mtb.Application')

その後、実行するとMtb.exeタスクマネージャーにプロセスが表示されますが、スクリプトが終了するとプロセスは強制終了されます。代わりに、私の質問は、この COM オブジェクトがトップレベルで宣言されているか、関数内で宣言されているかが問題になるのはなぜですか?

4

3 に答える 3