こんにちは、snuowです。社給品のPCの場合、好き勝手にソフトウェアをインストールできないことがあると思います。そんな時環境構築できないWindowsPCにおいて、pythonで作成したプログラムを動かす場合、pyinstallerを使うことがあると思います。
ただ、pandasなどの重量級ライブラリを使用すると、--onefile
でexeにまとめたときに、200MBを超える巨大なファイルになってしまいます。このexe大きすぎ問題を解決したいと思います。

pandas導入時のexe重すぎる問題・・・
私が、当時作ったツールで使用したライブラリは下記のようになっていました。pandasから特定の機能だけ抜き出したら軽くなるのでは?と思ったがそんなことはなかったぜ・・・
import glob import os import re import sys from datetime import datetime, timedelta from pandas import read_csv, DataFrame, concat
解決策:MKLが重い原因だった。
- MKL***というのが悪さをしているらしい。
- .specファイルに下記の項目を追加する。
- .specファイルは、pyinstallerを動かしたときに中間ファイルとして作成されます。
# -*- mode: python -*- block_cipher = None import sys sys.setrecursionlimit(50000) a = Analysis(['C:\\Users\\***\\PycharmProjects\\tool_for_armadillo\\main.py'], pathex=['C:\\Users\\***'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) #---------------追加ここから--------------- Key = ['mkl'] def remove_from_list(input, keys): outlist = [] for item in input: name, _, _ = item flag = 0 for key_word in keys: if name.find(key_word) > -1: flag = 1 if flag != 1: outlist.append(item) return outlist a.binaries = remove_from_list(a.binaries, Key) #---------------追加ここまで--------------- exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, runtime_tmpdir=None, console=True )
結果:1/5くらいには減らせました。
55MB程度に落ち着きました。

環境構築できないPC向けに作成しましたが、これでもまだ大きい気がしますね。動作的には問題ないのですが・・・
もし、より減らせる方法があれば教えてください。
TIPS:pyinstallerでアイコンを設定する方法
- pyinstallerでは自由にアイコンを設定することができます。下記に、アイコンの設定方法を紹介していますので参考にどうぞ!
コメント