PyInstallerで作成したexeが動かない人

2020-06-26

暇つぶしではないのですが「PyInstallerでexe化するプログラム」をPyInstallerでexe化してみたところうまく動作しませんでした。(exe化したexeでexeを作ることができませんでした。)

(GUIのデザインについては触れないでください…)

大事な部分ではないのですが、もう少し分かりやすく説明すると

  • 「.pyをPyInstallerで.exeにするGUIプログラム」A.pyを作成
  • A.pyをexe化したA.exeを作成
  • A.exeを起動して.pyをexe化しようとすると動かない(exe化できない)

A.py(スクリプト)でexe化できることはもちろん確認済み。

・・・

非常に分かりづらいですね。

大事な部分ではないので、理解できないけど理解したい人は図に書いてみてください。

要するにPyInstallerで作成したexeがちゃんと動かないという話です。

GUIとして画面は表示されるのですが、内部処理を進めても何も起こらないような感じです。

同じような感じで、PyInstallerで作成したexeが期待通りに動作しない、という人も結構いるのではないでしょうか。

.pyでは動作しているのに.exeにすると動作しないという。原因究明がわりと面倒な問題です。

Python

確認環境

  • Windows 10 Home(64bit)
  • Python 3.7(64bit)
  • PyInstaller 3.6でexe化

PyInstaller/noconsole/subprocessが原因

調べてみるとPyInstallerのnoconsoleオプションをつけると、プログラム内のsubprosessがうまく動作しないようです。

以下のブログ等を参考に修正してみたところ、動作させることができました。(日本語の情報は少ないですね。)

おそらく、上の英語のサイトを見て下の日本語のブログが書かれています。

それでも日本語で書かれているとありがたいです。

私にとっては「【悲報】PyInstallerさん、300MBのexeファイルを吐き出すようになる」が一番有用な情報だったのですが、PyInstaller関係のトラブル全般について書かれていることと、タイトルが私の欲しい情報とはまったく関係なかったのでなかなか見つけられませんでした。

かなり下の方の「subprocessモジュールを組み込んだアプリの –noconsole」の部分に書かれています。

他にもいろいろ読みましたが、解決に結びつけられるものはありませんでした。

↓のソースをコピペ(「subprocess_args」の定義を追加)して

(↑コメントの日本語はほぼ機械翻訳)

subbrocessの実行時に

みたいな感じで呼び出すことでsubprocess問題「は」解決できました。

ちなみに修正前はsubprocess.check_output()ではなくsubprocess.run()を使用していました。

いつもの愚痴

要するに、PyInstallerがsubprocessに対応していないということかと思います。

この「noconsole」オプションが曲者なんでしょうね。32bitだと「Heur.AdvML.B」として誤検知されてしまいますし。

このコンソールを出す出さないとか設定させる+デフォルトが「出す」となっていることに猛烈な古さを感じてしまうのは私だけでしょうか。

昔のInstallShieldでコンソールを消すための設定を必死で探した記憶があります。

機能を実現するため以外の「おまじない」的なコードなんてできるだけ書きたくないんだけどな~

そして、PyInstallerさん。動かないものをexe化できちゃダメでしょう。exe化する段階でエラーにすべきです。複雑なプログラムだったら、原因究明に膨大な時間を費やすことになってしまいます。

以上。

後記

最後までお読みくださりありがとうございます。

こんなに更新したのに、現在はほぼ誰も見ていないゴミカスクズ無価値ブログです。

よければ(はてな)ブックマークや拡散をお願いいたします。

更新の原動力として励ましが欲しいのです…<(_ _)>

当ブログ内お薦め記事

記事はここまでです。