7

COMPython 2.7 から MS Excel を駆動するために統合を使用しています。次のコードを実行すると、奇妙なことに気付きました。

import win32com.client
excelApp = win32com.client.dynamic.Dispatch('Excel.Application')

プロセスがEXCEL.EXEプロセス リスト (Windows タスク マネージャーまたは を使用して表示subprocess.Popen('tasklist')) に期待どおりに表示されます。次に、問題なく実行するために必要なすべてのことを行います。ただし、Excel を閉じると、次のようになります。

excelApp.Application.Quit()

プロセスを開始した Python インタープリターを閉じても、プロセスは持続します (この種のことは、Excel が別のプロセスで実行されるため理にかなっていますが、念のため)。このプロセスを終了する唯一の方法は、タスク マネージャーを使用して手動で行うか、次のように呼び出すことです。

subprocess.Popen("taskkill /F /im EXCEL.EXE",shell=True)

forceful/Fフラグが必要です。そうしないと、プロセスは終了しません。

これは実際には問題ではありませんが (私は願っています)、最初にドキュメントを「通常どおり」編集し、次に Python から Excel を呼び出してからもう一度「通常どおり」に編集したときに、これが問題を引き起こす可能性があるかどうかを尋ねたかったのですか? 潜在的に何回も(数十回)連続して?私が心配しているのは、競合するバージョンのドキュメントなどを作成することです。または、EXCEL.EXE安全のために毎回プロセスを終了する必要がありますか?

また、それsubprocess.Popen("taskkill")が例外を返さないことにも気付きcatchました。「存在しないプロセス」の強制終了の試みと、プロセスを終了しようとして失敗した試みを区別することに特に関心があります。

4

1 に答える 1

11

開いている本をすべて閉じて、アプリを終了し、アプリへの参照を削除するように指示してみてください。私は通常、com オブジェクトをクラスにラップします。これは、私の終了方法がどのように見えるかです。

      def quit(self):
        self.xlBook.Close(SaveChanges=0)
        self.xlApp.Quit()
        del self.xlApp

メインスレッドから Dispatch を呼び出していますか? わからない場合は必ず電話

pythoncom.CoInitialize()

発送前、および

pythoncom.CoUninitialize()

終了後

于 2013-08-24T18:33:42.107 に答える