- Published on
【Python】pyinstallerの軽量化【exe大きすぎ問題】
- Authors
- Name
- snuow
- @snuow_w
こんにちは、snuow です。社給品の PC の場合、好き勝手にソフトウェアをインストールできないことがあると思います。そんな時環境構築できない WindowsPC において、python で作成したプログラムを動かす場合、pyinstaller を使うことがあると思います。
ただ、pandas などの重量級ライブラリを使用すると、--onefile
で exe にまとめたときに、200MB を超える巨大なファイルになってしまいます。この exe 大きすぎ問題を解決したいと思います。
240MB は重すぎでしょ・・・
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 程度に落ち着きました。
1/5 程度に減らすことができました。
環境構築できない PC 向けに作成しましたが、これでもまだ大きい気がしますね。動作的には問題ないのですが・・・
もし、より減らせる方法があれば教えてください。