【pyinstaller】で作ったEXEの「起動が遅い」&「サイズがデカい」問題をとりあえず対処する方法
ナカジ(@cp_nakajun)です。
以前、Pythonでツールを作ったらEXEファイルにして共有してみよう!という記事で
「ちょっとしたツールをPythonで作ったら共有すると喜ばれるかもしれないよ」ということを書きました。
「pyinstaller」は手軽で便利、個人的には重宝してます。
というところなんですが…
pyinstallerにも弱点がありました。それは
「EXEファイルのサイズが巨大になり、起動がメチャクチャ遅くなる」
という問題です。
これは以下の記事を参照させて頂くと
・【悲報】PyInstallerさん、300MBのexeファイルを吐き出すようになる
pyinstallerの仕様が原因のようでビルド時にオプションで「–onefile」を指定し「1つのEXEにまとめた」場合、ビルドをした開発環境のライブラリをすべて取り込む為に起こるようです。
僕は開発環境に「pandas」をインストールしたことでこの現象に気がつきました。
それ以前に作ったツールをちょっと修正しただけなのに出てきたEXEファイルが巨大かつ起動がメチャクチャ遅い…みたいな感じです。
解決策については、先にご紹介した記事に詳しく書かれていますので参考にされると良いと思います。
と、これで終わってしまうと僕がなんでこの記事を書いたのかわからなくなってしまうので
以下に先の記事を読みつつ、現状の僕が思う「とりあえずの対処」を紹介します。
pyinstallerでEXEを作るときのマイルール
というわけで、今の僕の状況やスキルを前提に考えてますが
- 「–exculude」オプションで必要ないものを除く
- 「–onefile」をあきらめる
という2つの考え方でとりあえず対処しようと思ってます。
ちなみにちょっと大事な前提ですが、僕はAnacondaを使ってません。
僕のスキルや状況がAnacondaを必要なところにないですし
個人的に「便利なライブラリが簡単にセットアップできる」とはいえ、自分のPCに使えもしないライブラリが膨大にセットアップされことがカロリーの過剰摂取のように感じるので
普通にPythonをインストールして、ライブラリーはpipで追加してます。
先に紹介した記事(【悲報】PyInstallerさん、300MBのexeファイルを吐き出すようになる)にも
具体的にはAnacondaじゃないPython環境を一個作っておくという事ですね。
上でも述べましたがPyInstallerはAnacondaから切り離された環境で使うのがベストです。
とあります。
「–exculude」オプションで必要ないものを除く
まずはこの「–exculude」オプションで対応できるものは対応します。
現状、僕の環境の場合は「pandas」を「–exculude」オプションで指定すれば、普通に使えるEXEファイルが作れます。
コマンドとしては
pyinstaller --onefile --exclude pandas example.py
です。
「–exculude」は複数回指定できるので、除外したいものが2~3個程度ならコレで対応しようと思ってます。
「–onefile」をあきらめる
けっこう元も子もない方法ですが、EXEの用途や状況に応じて「–onefile」が無理ならあきらめようと思ってます。
そもそも「pandas」を使ったツールはこの方法を取ることになると思いますし。
ただ「–onefile」をあきらめるということは、せっかくのアプリが以下の画像のように複数ファイルで構成されることになるので
ちょっとスマートじゃない… かっこわるいというか… と感じますし
作ったツールを配布するにも、それを使う人の利便性においても気にする必要があることが出てくることがあります。
まとめ
個人的に「pyinstaller」のいいところは「サッと作ってサッと配れる」、サッとアプリ化できるというところなので
一応、別の方法でEXE化することも調べてみたのですが
設定ファイルを作る必要があったりなんだり、多少手間がかかるので今は紹介した2つの考え方で落ち着きました。
この先でもっとまともなアプリを作れるようになったらそんな方法も学びたいと思います。