Pythonで組んだプログラムをPyInstallerでexe化したらめちゃくちゃサイズがでかくなった件【2019年6月、解決策追記】

PyInstallerでexe化したらサイズが大きすぎて顔をしかめる赤ちゃん プログラミング

Pythonで組んだ自分のプログラムをexe化して実行してみたいと思い、ネット上でなんかいい方法はないか調べていたら、PyInstallerとやらを使えばできる?らしいとのこと。

とりあえず調べた通りにPyInstallerとやらをインストールしてみました。

インストールはコマンドプロンプトで

pip install pyinstaller

と打ち込むだけで簡単にできました。

PyInstallerで自分の組んだプログラムをexe化してみた

Pythonで組んだプログラムをPyInstallerでexe化するには、まず対象となるプログラムファイルのディレクトリをコマンドプロンプトで指定します。

コマンドプロンプトに

cd C:\Users\ユーザー名\Desktop\Python学習\exe化したいプログラムのあるディレクトリ

といった感じで入力します(cdとパスの間は必ず半角スペースを開ける)。

PyInstaller:実行手順1

入力したらエンターキーを押します。これでexe化したいプログラムファイルのあるディレクトリを選択することができました。

次はちょっと複雑ですが、以下のようなコードを打ち込みます。

pyinstaller exe化したいプログラムファイル名.py --onefile

最後に半角スペースを1つ開けて、

--onefile

という文字を入力しておくことで、1つのexeファイルとして出力できます。

僕の場合はmain.pyというファイル名にしてあるので、以下のように打ち込みました。

PyInstaller:実行手順2

この状態でエンターキーを押すとexe化が始まります。

PyInstaller:実行手順3

何やらよく分からないコードが次々と現れていますが、気にせずにじっと待機します。この間、対象のディレクトリ内によく分からないファイルが自動で生成されます。

1分くらい待たされましたが、無事処理は終了したようです。

PyInstaller:実行手順4

これでexeファイルが出来上がっているはずなので、distと書かれたフォルダを開きます。

すると中にmain.exeがありました。

PyInstaller:実行手順5

・・・と、ここで違和感に気付きました。

31862KB・・・・・・・31MB!?

PyInstaller:exeファイルが大きい

exeファイルってこんなに大きかったか?

ネット上からダウンロードできるフリーソフトのexeでも大きくて2~3MBくらいのはずなんですけどね・・・・

そんでもって試しにちゃんと動くかどうか試してみたら、起動がめっちゃ遅い!

PyInstaller:exe読み込み

ロード中のコンソール画面ですが、ずっと真っ黒なままです。

ロードが完全に終わると以下のようにちゃんと起動しますが、多分ここまで表示されるのに10秒くらいかかっています。

PyInstaller:exe化成功

元のプログラムファイルは11KBくらいなのにexe化したら30MB超えるとかどうなってんの・・・

解決策:2019年6月24日追記

どうやらPyInstallerではデフォルトのままexe化しようとすると、自分のPython環境にインストールされているモジュールが全て取り込まれてしまう模様。

これを回避するには、exe化する際に取り込む必要のないモジュールを除外しないといけないということです。

僕の環境では特にnumpyとpandasが重いようなので、exe化する際にこの2つのモジュールを取り込まないように設定することにしました。

設定方法は、コマンドプロンプトでexe化したいスクリプトファイルのあるディレクトリに移動し、以下のように打ち込んで実行します。

pyinstaller main.py --onefile --noconsole --exclude numpy --exclude pandas

pyinstaller main.py の後ろに、

--exclude モジュール名

と続けて打ち込むことで、必要の無いライブラリやモジュールを取り込まないように設定できます。

numpyは処理速度の遅いPythonにおいて数値計算を高速で行うために必要なモジュール、pandasはデータ解析用のモジュールですが、僕の組んだプログラムではどちらも一切使用していないので除外しました。

これによって31MBもあったexeファイルの容量が約半分の15MBになりました。

numpyとpandasを除外した後のexeファイルの容量

これよりもさらにサイズの縮小を行うには、自分の組んだプログラムで一切使われていないモジュールを狙ってexcludeしていかないといけないのですが、下手に色々除外してしまうとexeファイルを実行する際にエラーを吐くようになります。

そのため、あなたのPython環境にインストールしているモジュールの中で特に重いものだけを除外の対象にしてexe化するようにした方がいいと思います。

え? numpyもpandasもインポートしているって?

その場合はexe化すると30MB以上になってしまうのはほぼ確定かと思いますので、潔く諦めましょう(笑)

コメント