見出し画像

pyinstaller(onfileオプション付き)でexe化したpythonプログラムを別プログラムから終了させる話


はじめに

前回に続いてpythonの話です。

今度はこんなユースケースです。

1. pythonで実装されたコードを配布する
2. 配布コードを実行するPCには、Python環境がインストールされていない
3. 配布コードは、別途開発したC#プログラムで起動/終了を制御する

pythonでバックエンドが実装され、UIがC#で提供されているみたいな構成をイメージして下さい。

こちらも、困りごとに対する答えをgoogle先生に質問してもドンピシャな回答がなかったので、同じに悩みに直面している方の助けになると幸いです。
(書いた後に気が付いたけど、ドンピシャな回答あった)

PythonコードをEXE化して、C#から起動させよう

pythonコードをEXE化する方法自体は色々資料があります。
今回は下記Qiita記事に従って、onfileオプションを使ってpythonコードを1ファイル化しました。
PyInstallerでexeファイル化

また、別EXEファイルをC#から起動させる方法も色々資料が見つかります。
C# GUIからバックグラウンドでプロセスを実行し管理する

このあたりの情報を元に、大枠の仕組みの実装自体はスムーズに行きました。

どんな事が起きたのか?

何気なくタスクマネージャーでプロセスを確認すると、exe化したpythonコードが二個動いています。
pythonコード実行完了前にプログラムを終了させると、案の定存部プロセスが誕生しました。

画像1

情報を探していると下記情報が見つかりました。
https://pyinstaller.readthedocs.io/en/stable/operating-mode.html?highlight=onefile#how-the-one-file-program-works

要約すると下記のような感じの内容です。

exeを実行すると、ブートローダーがプログラムの実行に必要な各種ファイルを一時保存用のディレクトリに展開するよ!これには時間が結構掛かるよ!

ブートローダーは、その後展開情報を読み取ってpythonプログラムを実行するよ!

ptyhonプログラムが終了すると、ブートローダーは一時フォルダ内の各種ファイルを破棄するよ!

onfileオプション付きで生成したexeファイルは、裏側で二つのプロセスが動く仕様な様です。

何が困るのか?どうしたのか?

python処理の途中で処理を中断させたい場合にプロセスをkillすると、
 ・ブートローダーが起動したPythonプログラムが動いたままになる。
    ・先にブートローダーが死ぬので、一時ファイルが残ったままになる
という問題が生じてしまいます。

なので、子プロセスの方から終了させる必要があります。

弊社事例に限ると、pythonプログラムがC#プログラムとjsonで通信を行っていたのでプログラムの終了命令を導入して、子プロセスから終了させる事にしています。

上記のように子プロセスの方から強制終了させていけば良いですが、こちらは前回と違ってドンピシャな答えが見つかったので、最後に紹介します。

https://mariomucalo.com/kill-a-one-file-python-process-in-c/

おわりに

同じに悩みに直面している方の助けになると幸いです。

メンバー募集中です
アダコテックは上記のような画像処理技術を使って、大手メーカーの検査ラインを自動化するソフトウェアを開発している会社です。
機械学習や画像処理の内部ロジックに興味がある方、ご連絡下さい!
我々と一緒にモノづくりに革新を起こしましょう!
https://adacotech.co.jp/recruit

この記事が気に入ったらサポートをしてみませんか?